1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _IPQOS_CONF_H 28 #define _IPQOS_CONF_H 29 30 #pragma ident "%Z%%M% %I% %E% SMI" 31 32 #include <sys/stat.h> 33 #include <sys/types.h> 34 #include <sys/nvpair.h> 35 36 #ifdef __cplusplus 37 extern "C" { 38 #endif 39 40 /* debug level bits */ 41 #define L0 0x01 42 #define L1 0x02 43 #define L2 0x04 44 #define DIFF 0x08 45 #define KRET 0x10 46 #define APPLY 0x20 47 #define MHME 0x40 48 #define RBK 0x80 49 50 /* directory for types files */ 51 #define TYPES_FILE_DIR "/usr/lib/ipqosconf/" 52 53 /* location of lock file */ 54 #define IPQOS_CONF_LOCK_FILE "/var/run/ipqosconf.lock" 55 56 /* location of startup config file */ 57 #define IPQOS_CONF_INIT_PATH "/etc/inet/ipqosinit.conf" 58 59 /* ipqosconf commands */ 60 61 #define IPQOS_CONF_APPLY 1 62 #define IPQOS_CONF_VIEW 2 63 #define IPQOS_CONF_COMMIT 3 64 #define IPQOS_CONF_FLUSH 4 65 66 /* print ntabs to stream fp */ 67 68 #define PRINT_TABS(fp, ntabs)\ 69 {\ 70 int x;\ 71 for (x = 0; x < ntabs; x++)\ 72 (void) fprintf(fp, "\t");\ 73 } 74 75 /* having to define this as ip6.h version in _KERNEL guard */ 76 #ifndef V4_PART_OF_V6 77 #define V4_PART_OF_V6(v6) v6._S6_un._S6_u32[3] 78 #endif 79 80 /* 81 * given pointer cp advance it to the first non-space character. 82 */ 83 #define SKIPWS(cp) while (isspace(*cp) && (*cp != '\0')) cp++ 84 85 /* extract the v4 and v6 bits of the ip_version enumeration from the filter */ 86 #define VERSION_IS_V4(flt) ((flt)->ip_versions & 0x01) 87 #define VERSION_IS_V6(flt) ((flt)->ip_versions & 0x02) 88 89 /* retrieve short name from a module.name nvpair name */ 90 #define SHORT_NAME(longnme) (strchr(longnme, '.') + 1) 91 92 /* latest version of cfg file supported (1.0) */ 93 #define IPQOS_CUR_FMT_MAJOR_VER 1 94 #define IPQOS_CUR_FMT_MINOR_VER 0 95 96 /* length of string buffer used for storing an integer as a string */ 97 #define IPQOS_INT_STR_LEN 15 98 99 /* length of line buffer used to read types file */ 100 #define IPQOS_CONF_TYPE_LINE_LEN 1024 101 102 /* length of buffer used to store name of type when reading types file */ 103 #define IPQOS_CONF_TYPE_LEN 24 104 105 /* max length of value string in types file */ 106 #define IPQOS_VALST_MAXLEN 100 107 108 /* initial size of line buffer used by readtoken */ 109 #define IPQOS_CONF_LINEBUF_SZ 150 110 111 /* length of class/filter/action names */ 112 #define IPQOS_CONF_NAME_LEN 24 113 114 /* length of module names */ 115 #define IPQOS_CONF_MOD_NAME_LEN 10 116 117 /* IPQOS_CONF_NAME_LEN + IPQOS_CONF_MOD_NAME_LEN */ 118 /* must be a numeric literal for use in scanf() format string */ 119 #define IPQOS_CONF_PNAME_LEN 34 120 121 /* length of buffer used to construct msgs for printing */ 122 #define IPQOS_MSG_BUF_SZ 200 123 /* 124 * Define CURL here so that while you are reading 125 * the code, it does not affect "vi" in pattern 126 * matching. 127 */ 128 #define CURL_BEGIN '{' 129 #define CURL_END '}' 130 131 /* internal return codes */ 132 #define IPQOS_CONF_SUCCESS 0 133 #define IPQOS_CONF_ERR 1 134 #define IPQOS_CONF_RECOVER_ERR 2 135 #define IPQOS_CONF_CURL_END 3 136 #define IPQOS_CONF_CURL_BEGIN 4 137 #define IPQOS_CONF_EOF 5 138 #define IPQOS_CONF_NO_VER_STR 6 139 140 /* special tokens in config file */ 141 #define IPQOS_CONF_IP_VERSION_STR "ip_version" 142 #define IPQOS_CONF_NEXT_ACTION_STR "next_action" 143 #define IPQOS_CONF_NAME_STR "name" 144 #define IPQOS_CONF_MODULE_STR "module" 145 #define IPQOS_CONF_FILTER_STR "filter" 146 #define IPQOS_CONF_ACTION_STR "action" 147 #define IPQOS_CONF_CLASS_STR "class" 148 #define IPQOS_CONF_PARAMS_STR "params" 149 #define IPQOS_CONF_NEXT_STR "next" 150 #define IPQOS_CONF_STATS_ENABLE_STR "enable_stats" 151 #define IPQOS_CONF_GLOBAL_STATS_STR "global_stats" 152 #define IPQOS_CONF_DROP_STR "drop" 153 #define IPQOS_CONF_CONT_STR "continue" 154 #define IPQOS_CONF_DEFER_STR "defer" 155 #define IPQOS_CONF_TRUE_STR "true" 156 #define IPQOS_CONF_FALSE_STR "false" 157 #define IPQOS_FMT_VERSION_STR "fmt_version" 158 #define IPQOS_IFNAME_STR "if_name" 159 #define IPQOS_PLACE_PRM_STR IPQOS_CONF_PARAMS_STR 160 #define IPQOS_PLACE_FILTER_STR IPQOS_CONF_FILTER_STR 161 #define IPQOS_PLACE_MAP_STR "map" 162 163 /* special tokens in types file */ 164 #define IPQOS_CONF_PERM_FILTER_MK "#PERM_FILTER" 165 #define IPQOS_CONF_PERM_CLASS_MK "#PERM_CLASS" 166 #define IPQOS_FMT_STR "fmt_version" 167 #define IPQOS_MOD_STR "mod_version" 168 169 170 /* nvlist parameters */ 171 #define IPQOS_CONF_IP_VERSION "ipgpc.ip_version" 172 173 /* name lookup errors returned from domultihome() */ 174 #define IPQOS_LOOKUP_RETRY 1 175 #define IPQOS_LOOKUP_FAIL 2 176 177 /* 178 * used in calls to ipp_action_info() to encapuslate both an action and 179 * an ipqosconf internal return code. 180 */ 181 typedef struct ipqos_actinfo_prm_s { 182 struct ipqos_conf_action_s *action; 183 int intl_ret; 184 } ipqos_actinfo_prm_t; 185 186 /* 187 * skeletal list element struct used in manipulating lists of more complex 188 * structures. 189 */ 190 typedef struct ipqos_list_el_s { 191 struct ipqos_list_el_s *next; 192 } ipqos_list_el_t; 193 194 typedef struct str_str { 195 char *s1; 196 char *s2; 197 } str_str_t; 198 199 typedef struct str_val { 200 char *string; 201 int value; 202 } str_val_t; 203 204 typedef struct str_val_nd { 205 struct str_val sv; 206 struct str_val_nd *next; 207 } str_val_nd_t; 208 209 /* type of msg to be printed by ipqos_msg */ 210 enum msg_type { MT_ERROR, MT_WARNING, MT_LOG, MT_ENOSTR }; 211 212 /* enum for allowable parameter types */ 213 214 typedef enum ipqos_nvtype_e { 215 IPQOS_DATA_TYPE_UINT8, 216 IPQOS_DATA_TYPE_INT16, 217 IPQOS_DATA_TYPE_UINT16, 218 IPQOS_DATA_TYPE_INT32, 219 IPQOS_DATA_TYPE_UINT32, 220 IPQOS_DATA_TYPE_BOOLEAN, 221 IPQOS_DATA_TYPE_STRING, 222 IPQOS_DATA_TYPE_ACTION, 223 IPQOS_DATA_TYPE_ADDRESS, 224 IPQOS_DATA_TYPE_PORT, 225 IPQOS_DATA_TYPE_PROTO, 226 IPQOS_DATA_TYPE_ENUM, 227 IPQOS_DATA_TYPE_IFNAME, 228 IPQOS_DATA_TYPE_M_INDEX, 229 IPQOS_DATA_TYPE_INT_ARRAY, 230 IPQOS_DATA_TYPE_USER, 231 IPQOS_DATA_TYPE_ADDRESS_MASK, 232 IPQOS_DATA_TYPE_IFINDEX 233 } ipqos_nvtype_t; 234 235 /* 236 * passed to readnvpair to indicate which special meanings for nv names 237 * to use. 238 */ 239 typedef enum place_e { 240 PL_ACTION, PL_FILTER, PL_CLASS, PL_PARAMS, PL_MAP, PL_ANY} place_t; 241 242 243 /* classifier filter representation */ 244 245 typedef struct ipqos_conf_filter_s { 246 struct ipqos_conf_filter_s *next; 247 char name[IPQOS_CONF_NAME_LEN]; 248 char class_name[IPQOS_CONF_NAME_LEN]; 249 nvlist_t *nvlist; 250 boolean_t new; 251 boolean_t modified; 252 boolean_t cr_mod; 253 boolean_t todel; 254 boolean_t deleted; 255 uint32_t originator; 256 char *src_nd_name; 257 char *dst_nd_name; 258 int instance; 259 uint32_t lineno; 260 uint32_t ip_versions; 261 int nlerr; 262 } ipqos_conf_filter_t; 263 264 265 /* 266 * action reference - used to store information and reference an action struct. 267 */ 268 269 typedef struct ipqos_conf_act_ref_s { 270 struct ipqos_conf_act_ref_s *next; 271 struct ipqos_conf_act_ref_s *prev; 272 char name[IPQOS_CONF_NAME_LEN]; 273 char field[IPQOS_CONF_PNAME_LEN]; 274 struct ipqos_conf_action_s *action; 275 nvlist_t *nvlist; 276 } ipqos_conf_act_ref_t; 277 278 279 /* classifier class representation */ 280 281 typedef struct ipqos_conf_class_s { 282 struct ipqos_conf_class_s *next; 283 char name[IPQOS_CONF_NAME_LEN]; 284 nvlist_t *nvlist; 285 ipqos_conf_act_ref_t *alist; 286 boolean_t modified; 287 boolean_t new; 288 boolean_t cr_mod; 289 boolean_t todel; 290 boolean_t deleted; 291 boolean_t stats_enable; 292 uint32_t originator; 293 uint32_t lineno; 294 } ipqos_conf_class_t; 295 296 /* action parameters representation */ 297 298 typedef struct ipqos_conf_params_s { 299 struct ipqos_conf_params_s *next; 300 ipqos_conf_act_ref_t *actions; 301 nvlist_t *nvlist; 302 boolean_t modified; 303 boolean_t stats_enable; 304 uint32_t originator; 305 uint32_t lineno; 306 boolean_t cr_mod; 307 } ipqos_conf_params_t; 308 309 310 /* signifys which stage of configuration application has just past */ 311 enum visit {ADD_VISITED = 1, MOD_VISITED, REM_VISITED, INCYCLE_VISITED}; 312 313 /* 314 * action representation, with parameters, and lists of filters and classes 315 * if classifier action. 316 */ 317 typedef struct ipqos_conf_action_s { 318 struct ipqos_conf_action_s *next; 319 char name[IPQOS_CONF_NAME_LEN]; 320 char module[IPQOS_CONF_NAME_LEN]; 321 ipqos_conf_filter_t *filters; 322 ipqos_conf_class_t *classes; 323 ipqos_conf_params_t *params; 324 nvlist_t *nvlist; 325 boolean_t todel; 326 boolean_t deleted; 327 boolean_t new; 328 boolean_t modified; 329 boolean_t cr_mod; 330 ipqos_conf_act_ref_t *dependencies; 331 enum visit visited; 332 uint32_t lineno; 333 ipqos_conf_filter_t *retry_filters; 334 char **perm_classes; 335 int num_perm_classes; 336 int module_version; 337 } ipqos_conf_action_t; 338 339 340 #ifdef __cplusplus 341 } 342 #endif 343 344 #endif /* _IPQOS_CONF_H */ 345