blob: 402d08413e8a835d080eb4f4f6aa431ed77bf2e2 [file] [log] [blame]
Willy Tarreau3fdb3662012-11-12 00:42:33 +01001/*
2 * include/proto/obj_type.h
3 * This file contains function prototypes to manipulate object types
4 *
Willy Tarreau66337a02013-09-29 09:15:31 +02005 * Copyright (C) 2000-2013 Willy Tarreau - w@1wt.eu
Willy Tarreau3fdb3662012-11-12 00:42:33 +01006 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation, version 2.1
10 * exclusively.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22#ifndef _PROTO_OBJ_TYPE_H
23#define _PROTO_OBJ_TYPE_H
24
Willy Tarreau4c7e4b72020-05-27 12:58:42 +020025#include <haproxy/api.h>
Willy Tarreaud0ef4392020-06-02 09:38:52 +020026#include <haproxy/pool.h>
Willy Tarreau8a8d83b2015-04-13 13:24:54 +020027#include <types/applet.h>
Willy Tarreau51c21842013-09-29 09:06:42 +020028#include <types/connection.h>
Willy Tarreau3fdb3662012-11-12 00:42:33 +010029#include <types/listener.h>
30#include <types/obj_type.h>
31#include <types/proxy.h>
32#include <types/server.h>
Baptiste Assmann0b9ce822018-01-30 08:10:20 +010033#include <types/stream.h>
Willy Tarreau3fdb3662012-11-12 00:42:33 +010034#include <types/stream_interface.h>
Christopher Faulet38290462020-04-21 11:46:40 +020035#include <types/checks.h>
Willy Tarreau3fdb3662012-11-12 00:42:33 +010036
Willy Tarreau6ea63c32019-05-22 09:30:09 +020037static inline enum obj_type obj_type(const enum obj_type *t)
Willy Tarreau3fdb3662012-11-12 00:42:33 +010038{
Willy Tarreau66337a02013-09-29 09:15:31 +020039 if (!t || *t >= OBJ_TYPE_ENTRIES)
Willy Tarreau3fdb3662012-11-12 00:42:33 +010040 return OBJ_TYPE_NONE;
41 return *t;
42}
43
Willy Tarreau6ea63c32019-05-22 09:30:09 +020044static inline const char *obj_type_name(const enum obj_type *t)
Willy Tarreau55e4ecd2012-12-08 17:48:47 +010045{
46 switch (obj_type(t)) {
Willy Tarreaud5e3c712018-12-18 16:29:48 +010047 case OBJ_TYPE_NONE: return "NONE";
Willy Tarreau55e4ecd2012-12-08 17:48:47 +010048 case OBJ_TYPE_LISTENER: return "LISTENER";
49 case OBJ_TYPE_PROXY: return "PROXY";
50 case OBJ_TYPE_SERVER: return "SERVER";
51 case OBJ_TYPE_APPLET: return "APPLET";
Willy Tarreau0788f472013-10-24 22:45:25 +020052 case OBJ_TYPE_APPCTX: return "APPCTX";
Willy Tarreau51c21842013-09-29 09:06:42 +020053 case OBJ_TYPE_CONN: return "CONN";
Willy Tarreaud5e3c712018-12-18 16:29:48 +010054 case OBJ_TYPE_SRVRQ: return "SRVRQ";
55 case OBJ_TYPE_CS: return "CS";
Baptiste Assmann0b9ce822018-01-30 08:10:20 +010056 case OBJ_TYPE_STREAM: return "STREAM";
Christopher Faulet38290462020-04-21 11:46:40 +020057 case OBJ_TYPE_CHECK: return "CHECK";
Willy Tarreaud5e3c712018-12-18 16:29:48 +010058 default: return "!INVAL!";
Willy Tarreau55e4ecd2012-12-08 17:48:47 +010059 }
60}
61
Willy Tarreau66337a02013-09-29 09:15:31 +020062/* Note: for convenience, we provide two versions of each function :
63 * - __objt_<type> : converts the pointer without any control of its
64 * value nor type.
65 * - objt_<type> : same as above except that if the pointer is NULL
66 * or points to a non-matching type, NULL is returned instead.
67 */
68
69static inline struct listener *__objt_listener(enum obj_type *t)
70{
71 return container_of(t, struct listener, obj_type);
72}
73
Willy Tarreau3fdb3662012-11-12 00:42:33 +010074static inline struct listener *objt_listener(enum obj_type *t)
75{
76 if (!t || *t != OBJ_TYPE_LISTENER)
77 return NULL;
Willy Tarreau66337a02013-09-29 09:15:31 +020078 return __objt_listener(t);
79}
80
81static inline struct proxy *__objt_proxy(enum obj_type *t)
82{
83 return container_of(t, struct proxy, obj_type);
Willy Tarreau3fdb3662012-11-12 00:42:33 +010084}
85
86static inline struct proxy *objt_proxy(enum obj_type *t)
87{
88 if (!t || *t != OBJ_TYPE_PROXY)
89 return NULL;
Willy Tarreau66337a02013-09-29 09:15:31 +020090 return __objt_proxy(t);
91}
92
93static inline struct server *__objt_server(enum obj_type *t)
94{
95 return container_of(t, struct server, obj_type);
Willy Tarreau3fdb3662012-11-12 00:42:33 +010096}
97
98static inline struct server *objt_server(enum obj_type *t)
99{
100 if (!t || *t != OBJ_TYPE_SERVER)
101 return NULL;
Willy Tarreau66337a02013-09-29 09:15:31 +0200102 return __objt_server(t);
Willy Tarreau3fdb3662012-11-12 00:42:33 +0100103}
104
Willy Tarreau30576452015-04-13 13:50:30 +0200105static inline struct applet *__objt_applet(enum obj_type *t)
Willy Tarreau66337a02013-09-29 09:15:31 +0200106{
Willy Tarreau30576452015-04-13 13:50:30 +0200107 return container_of(t, struct applet, obj_type);
Willy Tarreau66337a02013-09-29 09:15:31 +0200108}
109
Willy Tarreau30576452015-04-13 13:50:30 +0200110static inline struct applet *objt_applet(enum obj_type *t)
Willy Tarreau3fdb3662012-11-12 00:42:33 +0100111{
112 if (!t || *t != OBJ_TYPE_APPLET)
113 return NULL;
Willy Tarreau66337a02013-09-29 09:15:31 +0200114 return __objt_applet(t);
Willy Tarreau3fdb3662012-11-12 00:42:33 +0100115}
116
Willy Tarreau0788f472013-10-24 22:45:25 +0200117static inline struct appctx *__objt_appctx(enum obj_type *t)
118{
119 return container_of(t, struct appctx, obj_type);
120}
121
122static inline struct appctx *objt_appctx(enum obj_type *t)
123{
124 if (!t || *t != OBJ_TYPE_APPCTX)
125 return NULL;
126 return __objt_appctx(t);
127}
128
Olivier Houcharde2b40b92017-09-13 18:30:23 +0200129static inline struct conn_stream *__objt_cs(enum obj_type *t)
130{
131 return (container_of(t, struct conn_stream, obj_type));
132}
133
134static inline struct conn_stream *objt_cs(enum obj_type *t)
135{
136 if (!t || *t != OBJ_TYPE_CS)
137 return NULL;
138 return __objt_cs(t);
139}
140
Willy Tarreau51c21842013-09-29 09:06:42 +0200141static inline struct connection *__objt_conn(enum obj_type *t)
142{
143 return container_of(t, struct connection, obj_type);
144}
145
146static inline struct connection *objt_conn(enum obj_type *t)
147{
148 if (!t || *t != OBJ_TYPE_CONN)
149 return NULL;
150 return __objt_conn(t);
151}
152
Olivier Houcharde2c222b2017-08-04 18:31:56 +0200153static inline struct dns_srvrq *__objt_dns_srvrq(enum obj_type *t)
154{
155 return container_of(t, struct dns_srvrq, obj_type);
156}
157
158static inline struct dns_srvrq *objt_dns_srvrq(enum obj_type *t)
159{
160 if (!t || *t != OBJ_TYPE_SRVRQ)
161 return NULL;
162 return __objt_dns_srvrq(t);
163}
164
Baptiste Assmann0b9ce822018-01-30 08:10:20 +0100165static inline struct stream *__objt_stream(enum obj_type *t)
166{
167 return container_of(t, struct stream, obj_type);
168}
169
170static inline struct stream *objt_stream(enum obj_type *t)
171{
172 if (!t || *t != OBJ_TYPE_STREAM)
173 return NULL;
174 return __objt_stream(t);
175}
176
Christopher Faulet38290462020-04-21 11:46:40 +0200177static inline struct check *__objt_check(enum obj_type *t)
178{
179 return container_of(t, struct check, obj_type);
180}
181
182static inline struct check *objt_check(enum obj_type *t)
183{
184 if (!t || *t != OBJ_TYPE_CHECK)
185 return NULL;
186 return __objt_check(t);
187}
188
Willy Tarreau55e4ecd2012-12-08 17:48:47 +0100189static inline void *obj_base_ptr(enum obj_type *t)
190{
191 switch (obj_type(t)) {
Willy Tarreaud5e3c712018-12-18 16:29:48 +0100192 case OBJ_TYPE_NONE: return NULL;
Willy Tarreau66337a02013-09-29 09:15:31 +0200193 case OBJ_TYPE_LISTENER: return __objt_listener(t);
194 case OBJ_TYPE_PROXY: return __objt_proxy(t);
195 case OBJ_TYPE_SERVER: return __objt_server(t);
196 case OBJ_TYPE_APPLET: return __objt_applet(t);
Willy Tarreau0788f472013-10-24 22:45:25 +0200197 case OBJ_TYPE_APPCTX: return __objt_appctx(t);
Willy Tarreau51c21842013-09-29 09:06:42 +0200198 case OBJ_TYPE_CONN: return __objt_conn(t);
Willy Tarreaud5e3c712018-12-18 16:29:48 +0100199 case OBJ_TYPE_SRVRQ: return __objt_dns_srvrq(t);
Olivier Houcharde2b40b92017-09-13 18:30:23 +0200200 case OBJ_TYPE_CS: return __objt_cs(t);
Christopher Fauleta142c1d2020-04-21 11:48:53 +0200201 case OBJ_TYPE_STREAM: return __objt_stream(t);
Christopher Faulet38290462020-04-21 11:46:40 +0200202 case OBJ_TYPE_CHECK: return __objt_check(t);
Willy Tarreaud5e3c712018-12-18 16:29:48 +0100203 default: return t; // exact pointer for invalid case
Willy Tarreau55e4ecd2012-12-08 17:48:47 +0100204 }
205}
206
Willy Tarreau3fdb3662012-11-12 00:42:33 +0100207#endif /* _PROTO_OBJ_TYPE_H */
208
209/*
210 * Local variables:
211 * c-indent-level: 8
212 * c-basic-offset: 8
213 * End:
214 */