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