-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathspoa.h
167 lines (148 loc) · 4.78 KB
/
spoa.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
/* Main SPOA server includes
*
* Copyright 2016 HAProxy Technologies, Christopher Faulet <cfaulet@haproxy.com>
* Copyright 2018 OZON / Thierry Fournier <thierry.fournier@ozon.io>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*/
#ifndef __SPOA_H__
#define __SPOA_H__
#include <pthread.h>
#include <stdbool.h>
#include <stdint.h>
#include <netinet/in.h>
#include <sys/time.h>
#ifndef MAX_FRAME_SIZE
#define MAX_FRAME_SIZE 16384
#endif
#define SPOP_VERSION "2.0"
#define SPOA_CAPABILITIES ""
/* Flags set on the SPOE frame */
#define SPOE_FRM_FL_FIN 0x00000001
/* All supported data types */
enum spoe_data_type {
SPOE_DATA_T_NULL = 0,
SPOE_DATA_T_BOOL,
SPOE_DATA_T_INT32,
SPOE_DATA_T_UINT32,
SPOE_DATA_T_INT64,
SPOE_DATA_T_UINT64,
SPOE_DATA_T_IPV4,
SPOE_DATA_T_IPV6,
SPOE_DATA_T_STR,
SPOE_DATA_T_BIN,
SPOE_DATA_TYPES
};
/* Scopes used for variables set by agents. It is a way to be agnotic to vars
* scope. */
enum spoe_vars_scope {
SPOE_SCOPE_PROC = 0, /* <=> SCOPE_PROC */
SPOE_SCOPE_SESS, /* <=> SCOPE_SESS */
SPOE_SCOPE_TXN, /* <=> SCOPE_TXN */
SPOE_SCOPE_REQ, /* <=> SCOPE_REQ */
SPOE_SCOPE_RES, /* <=> SCOPE_RES */
};
struct worker {
unsigned int id;
char buf[MAX_FRAME_SIZE];
unsigned int len;
unsigned int size;
int status_code;
unsigned int stream_id;
unsigned int frame_id;
bool healthcheck;
char ack[MAX_FRAME_SIZE];
unsigned int ack_len;
};
struct chunk {
char *str; /* beginning of the string itself. Might not be 0-terminated */
int len; /* current size of the string from first to last char */
};
union spoe_value {
bool boolean; /* use for boolean */
int32_t sint32; /* used for signed 32bits integers */
uint32_t uint32; /* used for signed 32bits integers */
int32_t sint64; /* used for signed 64bits integers */
uint32_t uint64; /* used for signed 64bits integers */
struct in_addr ipv4; /* used for ipv4 addresses */
struct in6_addr ipv6; /* used for ipv6 addresses */
struct chunk buffer; /* used for char strings or buffers */
};
/* Used to store sample constant */
struct spoe_data {
enum spoe_data_type type; /* SPOE_DATA_T_* */
union spoe_value u; /* spoe data value */
};
struct spoe_kv {
struct chunk name;
struct spoe_data value;
};
struct ps {
struct ps *next;
char *ext;
int (*init_worker)(struct worker *w);
int (*exec_message)(struct worker *w, void *ref, int nargs, struct spoe_kv *args);
int (*load_file)(struct worker *w, const char *file);
};
struct ps_message {
struct ps_message *next;
const char *name;
struct ps *ps;
void *ref;
};
extern bool debug;
extern pthread_key_t worker_id;
void ps_register(struct ps *ps);
void ps_register_message(struct ps *ps, const char *name, void *ref);
int set_var_null(struct worker *w,
const char *name, int name_len,
unsigned char scope);
int set_var_bool(struct worker *w,
const char *name, int name_len,
unsigned char scope, bool value);
int set_var_uint32(struct worker *w,
const char *name, int name_len,
unsigned char scope, uint32_t value);
int set_var_int32(struct worker *w,
const char *name, int name_len,
unsigned char scope, int32_t value);
int set_var_uint64(struct worker *w,
const char *name, int name_len,
unsigned char scope, uint64_t value);
int set_var_int64(struct worker *w,
const char *name, int name_len,
unsigned char scope, int64_t value);
int set_var_ipv4(struct worker *w,
const char *name, int name_len,
unsigned char scope,
struct in_addr *ipv4);
int set_var_ipv6(struct worker *w,
const char *name, int name_len,
unsigned char scope,
struct in6_addr *ipv6);
int set_var_string(struct worker *w,
const char *name, int name_len,
unsigned char scope,
const char *str, int strlen);
int set_var_bin(struct worker *w,
const char *name, int name_len,
unsigned char scope,
const char *str, int strlen);
#define LOG(fmt, args...) \
do { \
struct timeval now; \
int wid = *((int*)pthread_getspecific(worker_id)); \
\
gettimeofday(&now, NULL); \
fprintf(stderr, "%ld.%06ld [%02d] " fmt "\n", \
now.tv_sec, now.tv_usec, wid, ##args); \
} while (0)
#define DEBUG(x...) \
do { \
if (debug) \
LOG(x); \
} while (0)
#endif /* __SPOA_H__ */