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 (c) 2000 by Sun Microsystems, Inc.
24 * All rights reserved.
25 */
26
27 #ifndef _DHCP_NETWORK_H
28 #define _DHCP_NETWORK_H
29
30 #pragma ident "%Z%%M% %I% %E% SMI"
31
32 /*
33 * Implementation-specific data structures and constants for the binary
34 * files dhcp_network container. These structures are subject to change at
35 * any time.
36 */
37
38 #include <sys/types.h>
39 #include <dhcp_svc_public.h>
40
41 #ifdef __cplusplus
42 extern "C" {
43 #endif
44
45 /*
46 * The client id hash size is based on the idea that, given a perfect hash,
47 * the hash chain length shouldn't be more than the number of buckets.
48 * Given a worst case network with 2^24 addresses, that means we should
49 * have 4096 buckets; we shrink this by a bit to make the dn_header_t size
50 * be a power of two (32768 bytes). Note that we assert that a header is
51 * this size in open_dn().
52 */
53 #define DN_CIDHASHSZ 4056
54 #define DN_MAGIC 0x0d6c92e4 /* "dhcpnet" in hexadecimal world */
55 #define DN_NOIMAGE 0x80 /* image field not in use */
56 #define DN_NOREC 0x00000000 /* "no record" id value, must be zero */
57 #define DN_TEMPREC 0xffffffff /* "temp record" id value */
58 #define DN_HASHHEAD 0xfffffffe /* "hash chain head" id value */
59
60 typedef uint32_t dn_recid_t; /* record id type */
61
62 /*
63 * Macros to compute the record id for a record with address `addr' in a
64 * container with netmask `mask', and to convert a record id `recid' to its
65 * starting file offset within its container. Note that we reserve the
66 * record id value of 0 for DN_NOREC for reasons explained in open_dn().
67 */
68 #define RECID(addr, mask) ((dn_recid_t)(((addr) & ~(mask)) + 1))
69 #define RECID2OFFSET(recid) \
70 (((recid) == DN_TEMPREC) ? offsetof(dn_header_t, dnh_temp) : \
71 (sizeof (dn_header_t) + ((off_t)sizeof (dn_filerec_t) * ((recid) - 1))))
72
73 /*
74 * What each dn_rec_t looks like on-disk -- contains the dn_rec_t, pointers
75 * to the previous and next dn_rec_t's on its client id hash. See the big
76 * theory statement in dhcp_network.c for a discussion on the redundant
77 * dn_recid_t's.
78 */
79 typedef struct dn_filerec {
80 dn_recid_t rec_next[2]; /* id of next record in cidhash */
81 dn_recid_t rec_prev[2]; /* id of prev record in cidhash */
82 dn_rec_t rec_dn; /* actual dn_rec_t */
83 } dn_filerec_t;
84
85 /*
86 * Header atop each dhcp_network container -- contains some basic
87 * information about the container and an array of buckets to chain client
88 * id hashes from. See the big theory statement in dhcp_network.c for a
89 * discussion on the redundant dn_recid_t's and the concept of "images".
90 */
91 typedef struct dn_header {
92 unsigned char dnh_version; /* container version */
93 unsigned char dnh_dirty; /* container might be dirty */
94 unsigned char dnh_image; /* container's active image */
95 unsigned char dnh_tempimage; /* temporary record's image */
96 uint32_t dnh_magic; /* container magic */
97 ipaddr_t dnh_network; /* network number of table */
98 ipaddr_t dnh_netmask; /* netmask of network number */
99 dn_filerec_t dnh_temp; /* temporary record used in modify_dn */
100 uint32_t dnh_checks; /* number of check_dn full runs */
101 uint32_t dnh_errors; /* number of errors caught */
102 uint32_t dnh_pad[4]; /* for future use */
103
104 /*
105 * Note: read_header() assumes that dnh_cidhash is the last member.
106 */
107 dn_recid_t dnh_cidhash[DN_CIDHASHSZ][2]; /* cid hash buckets */
108 } dn_header_t;
109
110 /*
111 * Per-instance state for each handle returned from open_dn.
112 */
113 typedef struct dn_handle {
114 int dh_fd; /* fd for open file pointer */
115 unsigned int dh_oflags; /* flags passed into open_dn */
116 ipaddr_t dh_netmask; /* cached netmask of container */
117 } dn_handle_t;
118
119 #ifdef __cplusplus
120 }
121 #endif
122
123 #endif /* _DHCP_NETWORK_H */