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 (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #ifndef _DHCP_SYMBOL_H 27 #define _DHCP_SYMBOL_H 28 29 #pragma ident "%Z%%M% %I% %E% SMI" 30 31 /* 32 * This file, along with <dhcp_symbol_common.h>, contains the DHCP symbol 33 * constants and the definitions for the external interfaces to the parsing 34 * logic (contained in dhcp_symbol.c) for symbol definitions. These 35 * definitions can and should be used by all consumers of DHCP symbols. 36 */ 37 38 #include <sys/types.h> 39 #include <dhcp_svc_private.h> 40 #include <dhcp_symbol_common.h> 41 42 #ifdef __cplusplus 43 extern "C" { 44 #endif 45 46 /* 47 * Vendor class length (and implicitly, the number of classes) 48 */ 49 #define DSYM_CLASS_SIZE DSVC_MAX_MACSYM_LEN /* Single class max */ 50 #define DSYM_MAX_CLASS_SIZE (DSYM_CLASS_SIZE * 10) /* At least 10 */ 51 52 /* 53 * Maximum symbol length is defined by the libdhcpsvc. 54 */ 55 #define DSYM_MAX_SYM_LEN DSVC_MAX_MACSYM_LEN 56 57 /* 58 * symbol parsing error codes 59 */ 60 typedef enum { 61 DSYM_SUCCESS, 62 DSYM_SYNTAX_ERROR, 63 DSYM_NULL_FIELD, 64 DSYM_TOO_MANY_FIELDS, 65 DSYM_CODE_OUT_OF_RANGE, 66 DSYM_VALUE_OUT_OF_RANGE, 67 DSYM_INVALID_CAT, 68 DSYM_INVALID_TYPE, 69 DSYM_EXCEEDS_CLASS_SIZE, 70 DSYM_EXCEEDS_MAX_CLASS_SIZE, 71 DSYM_NO_MEMORY, 72 DSYM_INVALID_FIELD_NUM 73 } dsym_errcode_t; 74 75 /* 76 * symbol fields 77 */ 78 #define DSYM_CAT_FIELD 0 79 #define DSYM_CODE_FIELD 1 80 #define DSYM_TYPE_FIELD 2 81 #define DSYM_GRAN_FIELD 3 82 #define DSYM_MAX_FIELD 4 83 #define DSYM_NUM_FIELDS 5 84 #define DSYM_FIRST_FIELD DSYM_CAT_FIELD 85 86 /* 87 * This structure is used by the dhcp_symbol_t structure below 88 * when the option being defined is a vendor option. In which case, 89 * this structure contains the client classes for which the option 90 * applies. 91 */ 92 typedef struct dhcp_classes { 93 char **dc_names; 94 uint8_t dc_cnt; 95 } dhcp_classes_t; 96 97 /* 98 * This structure is used to define a DHCP symbol. The structure is 99 * used by both the inittab parsing routines and by the dhcptab parsing 100 * routines to define a symbol definition in either of those tables. 101 * Note that ds_dhcpv6 is defined last so that it needn't be initialized 102 * as part of the inittab_table[] definition. 103 */ 104 typedef struct dhcp_symbol { 105 dsym_category_t ds_category; /* category */ 106 ushort_t ds_code; /* option code */ 107 char ds_name[DSYM_MAX_SYM_LEN + 1]; /* option name */ 108 dsym_cdtype_t ds_type; /* type of parm */ 109 uchar_t ds_gran; /* granularity */ 110 uchar_t ds_max; /* maximum number */ 111 dhcp_classes_t ds_classes; /* client classes */ 112 uchar_t ds_dhcpv6; /* dhcpv6 flag */ 113 } dhcp_symbol_t; 114 115 extern void dsym_free_fields(char **); 116 extern void dsym_free_classes(dhcp_classes_t *); 117 extern void dsym_close_parser(char **, dhcp_symbol_t *); 118 extern dsym_errcode_t dsym_init_parser(const char *, const char *, char ***, 119 dhcp_symbol_t *); 120 extern dsym_errcode_t dsym_parse_field(int, char **, dhcp_symbol_t *); 121 extern dsym_errcode_t dsym_parser(char **, dhcp_symbol_t *, int *, boolean_t); 122 extern dsym_errcode_t dsym_get_cat_id(const char *, dsym_category_t *, 123 boolean_t); 124 extern dsym_errcode_t dsym_get_code_ranges(const char *cat, ushort_t *, 125 ushort_t *, boolean_t); 126 extern dsym_errcode_t dsym_get_type_id(const char *, dsym_cdtype_t *, 127 boolean_t); 128 129 #ifdef __cplusplus 130 } 131 #endif 132 133 #endif /* _DHCP_SYMBOL_H */