PostgreSQL Source Code
git master
inet.h
Go to the documentation of this file.
1
/*-------------------------------------------------------------------------
2
*
3
* inet.h
4
* Declarations for operations on INET datatypes.
5
*
6
*
7
* Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
8
* Portions Copyright (c) 1994, Regents of the University of California
9
*
10
* src/include/utils/inet.h
11
*
12
*-------------------------------------------------------------------------
13
*/
14
#ifndef INET_H
15
#define INET_H
16
17
#include "
fmgr.h
"
18
19
/*
20
* This is the internal storage format for IP addresses
21
* (both INET and CIDR datatypes):
22
*/
23
typedef
struct
24
{
25
unsigned
char
family
;
/* PGSQL_AF_INET or PGSQL_AF_INET6 */
26
unsigned
char
bits
;
/* number of bits in netmask */
27
unsigned
char
ipaddr[16];
/* up to 128 bits of address */
28
}
inet_struct
;
29
30
/*
31
* We use these values for the "family" field.
32
*
33
* Referencing all of the non-AF_INET types to AF_INET lets us work on
34
* machines which did not have the appropriate address family (like
35
* inet6 addresses when AF_INET6 wasn't present) but didn't cause a
36
* dump/reload requirement. Pre-7.4 databases used AF_INET for the family
37
* type on disk.
38
*/
39
#define PGSQL_AF_INET (AF_INET + 0)
40
#define PGSQL_AF_INET6 (AF_INET + 1)
41
42
/*
43
* Both INET and CIDR addresses are represented within Postgres as varlena
44
* objects, ie, there is a varlena header in front of the struct type
45
* depicted above. This struct depicts what we actually have in memory
46
* in "uncompressed" cases. Note that since the maximum data size is only
47
* 18 bytes, INET/CIDR will invariably be stored into tuples using the
48
* 1-byte-header varlena format. However, we have to be prepared to cope
49
* with the 4-byte-header format too, because various code may helpfully
50
* try to "decompress" 1-byte-header datums.
51
*/
52
typedef
struct
53
{
54
char
vl_len_[4];
/* Do not touch this field directly! */
55
inet_struct
inet_data
;
56
}
inet
;
57
58
/*
59
* Access macros. We use VARDATA_ANY so that we can process short-header
60
* varlena values without detoasting them. This requires a trick:
61
* VARDATA_ANY assumes the varlena header is already filled in, which is
62
* not the case when constructing a new value (until SET_INET_VARSIZE is
63
* called, which we typically can't do till the end). Therefore, we
64
* always initialize the newly-allocated value to zeroes (using palloc0).
65
* A zero length word will look like the not-1-byte case to VARDATA_ANY,
66
* and so we correctly construct an uncompressed value.
67
*
68
* Note that ip_addrsize(), ip_maxbits(), and SET_INET_VARSIZE() require
69
* the family field to be set correctly.
70
*/
71
#define ip_family(inetptr) \
72
(((inet_struct *) VARDATA_ANY(inetptr))->family)
73
74
#define ip_bits(inetptr) \
75
(((inet_struct *) VARDATA_ANY(inetptr))->bits)
76
77
#define ip_addr(inetptr) \
78
(((inet_struct *) VARDATA_ANY(inetptr))->ipaddr)
79
80
#define ip_addrsize(inetptr) \
81
(ip_family(inetptr) == PGSQL_AF_INET ? 4 : 16)
82
83
#define ip_maxbits(inetptr) \
84
(ip_family(inetptr) == PGSQL_AF_INET ? 32 : 128)
85
86
#define SET_INET_VARSIZE(dst) \
87
SET_VARSIZE(dst, VARHDRSZ + offsetof(inet_struct, ipaddr) + \
88
ip_addrsize(dst))
89
90
91
/*
92
* This is the internal storage format for MAC addresses:
93
*/
94
typedef
struct
macaddr
95
{
96
unsigned
char
a
;
97
unsigned
char
b
;
98
unsigned
char
c
;
99
unsigned
char
d
;
100
unsigned
char
e
;
101
unsigned
char
f
;
102
}
macaddr
;
103
104
/*
105
* This is the internal storage format for MAC8 addresses:
106
*/
107
typedef
struct
macaddr8
108
{
109
unsigned
char
a
;
110
unsigned
char
b
;
111
unsigned
char
c
;
112
unsigned
char
d
;
113
unsigned
char
e
;
114
unsigned
char
f
;
115
unsigned
char
g
;
116
unsigned
char
h
;
117
}
macaddr8
;
118
119
/*
120
* fmgr interface macros
121
*/
122
static
inline
inet
*
123
DatumGetInetPP
(
Datum
X)
124
{
125
return
(
inet
*)
PG_DETOAST_DATUM_PACKED
(X);
126
}
127
128
static
inline
Datum
129
InetPGetDatum
(
const
inet
*X)
130
{
131
return
PointerGetDatum
(X);
132
}
133
134
#define PG_GETARG_INET_PP(n) DatumGetInetPP(PG_GETARG_DATUM(n))
135
#define PG_RETURN_INET_P(x) return InetPGetDatum(x)
136
137
/* obsolescent variants */
138
static
inline
inet
*
139
DatumGetInetP
(
Datum
X)
140
{
141
return
(
inet
*)
PG_DETOAST_DATUM
(X);
142
}
143
#define PG_GETARG_INET_P(n) DatumGetInetP(PG_GETARG_DATUM(n))
144
145
/* macaddr is a fixed-length pass-by-reference datatype */
146
static
inline
macaddr
*
147
DatumGetMacaddrP
(
Datum
X)
148
{
149
return
(
macaddr
*)
DatumGetPointer
(X);
150
}
151
152
static
inline
Datum
153
MacaddrPGetDatum
(
const
macaddr
*X)
154
{
155
return
PointerGetDatum
(X);
156
}
157
158
#define PG_GETARG_MACADDR_P(n) DatumGetMacaddrP(PG_GETARG_DATUM(n))
159
#define PG_RETURN_MACADDR_P(x) return MacaddrPGetDatum(x)
160
161
/* macaddr8 is a fixed-length pass-by-reference datatype */
162
static
inline
macaddr8
*
163
DatumGetMacaddr8P
(
Datum
X)
164
{
165
return
(
macaddr8
*)
DatumGetPointer
(X);
166
}
167
168
static
inline
Datum
169
Macaddr8PGetDatum
(
const
macaddr8
*X)
170
{
171
return
PointerGetDatum
(X);
172
}
173
174
#define PG_GETARG_MACADDR8_P(n) DatumGetMacaddr8P(PG_GETARG_DATUM(n))
175
#define PG_RETURN_MACADDR8_P(x) return Macaddr8PGetDatum(x)
176
177
/*
178
* Support functions in network.c
179
*/
180
extern
inet
*
cidr_set_masklen_internal
(
const
inet
*src,
int
bits);
181
extern
int
bitncmp
(
const
unsigned
char
*l,
const
unsigned
char
*r,
int
n);
182
extern
int
bitncommon
(
const
unsigned
char
*l,
const
unsigned
char
*r,
int
n);
183
184
#endif
/* INET_H */
fmgr.h
PG_DETOAST_DATUM_PACKED
#define PG_DETOAST_DATUM_PACKED(datum)
Definition:
fmgr.h:248
PG_DETOAST_DATUM
#define PG_DETOAST_DATUM(datum)
Definition:
fmgr.h:240
PointerGetDatum
static Datum PointerGetDatum(const void *X)
Definition:
postgres.h:322
Datum
uintptr_t Datum
Definition:
postgres.h:64
DatumGetPointer
static Pointer DatumGetPointer(Datum X)
Definition:
postgres.h:312
inet_struct
Definition:
inet.h:24
inet_struct::bits
unsigned char bits
Definition:
inet.h:26
inet_struct::family
unsigned char family
Definition:
inet.h:25
inet
Definition:
inet.h:53
inet::inet_data
inet_struct inet_data
Definition:
inet.h:55
macaddr8
Definition:
inet.h:108
macaddr8::c
unsigned char c
Definition:
inet.h:111
macaddr8::b
unsigned char b
Definition:
inet.h:110
macaddr8::d
unsigned char d
Definition:
inet.h:112
macaddr8::e
unsigned char e
Definition:
inet.h:113
macaddr8::g
unsigned char g
Definition:
inet.h:115
macaddr8::h
unsigned char h
Definition:
inet.h:116
macaddr8::a
unsigned char a
Definition:
inet.h:109
macaddr8::f
unsigned char f
Definition:
inet.h:114
macaddr
Definition:
inet.h:95
macaddr::e
unsigned char e
Definition:
inet.h:100
macaddr::b
unsigned char b
Definition:
inet.h:97
macaddr::f
unsigned char f
Definition:
inet.h:101
macaddr::c
unsigned char c
Definition:
inet.h:98
macaddr::a
unsigned char a
Definition:
inet.h:96
macaddr::d
unsigned char d
Definition:
inet.h:99
MacaddrPGetDatum
static Datum MacaddrPGetDatum(const macaddr *X)
Definition:
inet.h:153
InetPGetDatum
static Datum InetPGetDatum(const inet *X)
Definition:
inet.h:129
bitncommon
int bitncommon(const unsigned char *l, const unsigned char *r, int n)
Definition:
network.c:1597
macaddr8
struct macaddr8 macaddr8
bitncmp
int bitncmp(const unsigned char *l, const unsigned char *r, int n)
Definition:
network.c:1563
DatumGetMacaddrP
static macaddr * DatumGetMacaddrP(Datum X)
Definition:
inet.h:147
DatumGetInetP
static inet * DatumGetInetP(Datum X)
Definition:
inet.h:139
cidr_set_masklen_internal
inet * cidr_set_masklen_internal(const inet *src, int bits)
Definition:
network.c:368
DatumGetInetPP
static inet * DatumGetInetPP(Datum X)
Definition:
inet.h:123
macaddr
struct macaddr macaddr
DatumGetMacaddr8P
static macaddr8 * DatumGetMacaddr8P(Datum X)
Definition:
inet.h:163
Macaddr8PGetDatum
static Datum Macaddr8PGetDatum(const macaddr8 *X)
Definition:
inet.h:169
src
include
utils
inet.h
Generated on Sun Oct 6 2024 12:13:25 for PostgreSQL Source Code by
1.9.1