blob: 03295680d6eeee424730f1459589f5c7291e124a [file] [log] [blame]
Matus Fabianb4515b42018-11-19 04:25:32 -08001/*
2 * Copyright (c) 2018 Cisco and/or its affiliates.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at:
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15/**
Paul Vinciguerrab5a575b2019-11-01 13:00:58 -040016 * @file syslog.h
17 * RFC5424 syslog protocol declarations
Matus Fabianb4515b42018-11-19 04:25:32 -080018 */
19#ifndef __included_syslog_h__
20#define __included_syslog_h__
21
22#include <vlib/vlib.h>
23#include <vnet/vnet.h>
24#include <vnet/ip/ip4_packet.h>
25
26/* syslog message facilities */
27#define foreach_syslog_facility \
28 _(0, KERNEL, "kernel") \
29 _(1, USER_LEVEL, "user-level") \
30 _(2, MAIL_SYSTEM, "mail-system") \
31 _(3, SYSTEM_DAEMONS, "system-daemons") \
32 _(4, SEC_AUTH, "security-authorization") \
33 _(5, SYSLOGD, "syslogd") \
34 _(6, LINE_PRINTER, "line-printer") \
35 _(7, NETWORK_NEWS, "network-news") \
36 _(8, UUCP, "uucp") \
37 _(9, CLOCK, "clock-daemon") \
38 _(11, FTP, "ftp-daemon") \
39 _(12, NTP, "ntp-subsystem") \
40 _(13, LOG_AUDIT, "log-audit") \
41 _(14, LOG_ALERT, "log-alert") \
42 _(16, LOCAL0, "local0") \
43 _(17, LOCAL1, "local1") \
44 _(18, LOCAL2, "local2") \
45 _(19, LOCAL3, "local3") \
46 _(20, LOCAL4, "local4") \
47 _(21, LOCAL5, "local5") \
48 _(22, LOCAL6, "local6") \
49 _(23, LOCAL7, "local7")
50
51typedef enum
52{
53#define _(v, N, s) SYSLOG_FACILITY_##N = v,
54 foreach_syslog_facility
55#undef _
56} syslog_facility_t;
57
58/* syslog message severities */
59#define foreach_syslog_severity \
60 _(0, EMERGENCY, "emergency") \
61 _(1, ALERT, "alert") \
62 _(2, CRITICAL, "critical") \
63 _(3, ERROR, "error") \
64 _(4, WARNING, "warning") \
65 _(5, NOTICE, "notice") \
66 _(6, INFORMATIONAL, "informational") \
67 _(7, DEBUG, "debug")
68
69typedef enum
70{
71#define _(v, N, s) SYSLOG_SEVERITY_##N = v,
72 foreach_syslog_severity
73#undef _
74} syslog_severity_t;
75
76/** syslog header */
77typedef struct
78{
79 /** facility value, part of priority */
80 syslog_facility_t facility;
81
82 /** severity value, part of priority */
83 syslog_severity_t severity;
84
85 /** message timestamp */
86 f64 timestamp;
87
88 /** application that originated the message RFC5424 6.2.5. */
89 char *app_name;
90
91 /** identify the type of message RFC5424 6.2.7. */
92 char *msgid;
93} syslog_header_t;
94
95/** syslog message */
96typedef struct
97{
98 /** header */
99 syslog_header_t header;
100
101 /** structured data RFC5424 6.3. */
102 u8 **structured_data;
103 u32 curr_sd_index;
104
105 /** free-form message RFC5424 6.4. */
106 u8 *msg;
107} syslog_msg_t;
108
109typedef struct
110{
111 /** process ID RFC5424 6.2.6. */
112 u32 procid;
113
114 /** time offset */
115 f64 time_offset;
116
117 /** IPv4 address of remote host (destination) */
118 ip4_address_t collector;
119
120 /** UDP port number of remote host (destination) */
121 u16 collector_port;
122
123 /** IPv4 address of sender (source) */
124 ip4_address_t src_address;
125
126 /** FIB table index */
127 u32 fib_index;
128
129 /** message size limit */
130 u32 max_msg_size;
131
132 /** severity filter (specified severity and greater match) */
133 syslog_severity_t severity_filter;
134
135 /** ip4-lookup node index */
136 u32 ip4_lookup_node_index;
137
138 /** convenience variables */
Matus Fabianb4515b42018-11-19 04:25:32 -0800139 vnet_main_t *vnet_main;
Filip Tehlar667bc422021-06-22 22:33:02 +0000140
141 u16 msg_id_base;
Matus Fabianb4515b42018-11-19 04:25:32 -0800142} syslog_main_t;
143
144extern syslog_main_t syslog_main;
145
146/**
147 * @brief Initialize syslog message header
148 *
149 * @param facility facility value
150 * @param severity severity level
151 * @param app_name application that originated message RFC424 6.2.5. (optional)
152 * @param msgid identify the type of message RFC5424 6.2.7. (optional)
153 */
154void syslog_msg_init (syslog_msg_t * syslog_msg, syslog_facility_t facility,
155 syslog_severity_t severity, char *app_name,
156 char *msgid);
157/**
158 * @brief Initialize structured data element
159 *
160 * @param sd_id structured data element name RFC5424 6.3.2.
161 */
162void syslog_msg_sd_init (syslog_msg_t * syslog_msg, char *sd_id);
163
164/**
165 * @brief Add structured data elemnt parameter name-value pair RFC5424 6.3.3.
166 */
167void syslog_msg_add_sd_param (syslog_msg_t * syslog_msg, char *name,
168 char *fmt, ...);
169
170/**
171 * @brief Add free-form message RFC5424 6.4.
172 */
173void syslog_msg_add_msg (syslog_msg_t * syslog_msg, char *fmt, ...);
174
175/**
176 * @brief Send syslog message
177 */
178int syslog_msg_send (syslog_msg_t * syslog_msg);
179
180/**
181 * @brief Set syslog sender configuration
182 *
183 * @param collector IPv4 address of syslog collector (destination)
184 * @param collector_port UDP port of syslog colector (destination)
185 * @param src IPv4 address of syslog sender (source)
186 * @param vrf_id VRF/FIB table ID
187 * @param max_msg_size maximum message length
188 */
189vnet_api_error_t set_syslog_sender (ip4_address_t * collector,
190 u16 collector_port, ip4_address_t * src,
191 u32 vrf_id, u32 max_msg_size);
192
193/**
194 * @brief Check if syslog logging is enabled
195 *
196 * @return 1 if syslog logging is enabled, 0 otherwise
197 */
198always_inline int
199syslog_is_enabled (void)
200{
201 syslog_main_t *sm = &syslog_main;
202
203 return sm->collector.as_u32 ? 1 : 0;
204}
205
206/**
207 * @brief Severity filter test
208 *
209 * @return 1 if message with specified severity is not selected to be logged
210 */
211always_inline int
212syslog_severity_filter_block (syslog_severity_t s)
213{
214 syslog_main_t *sm = &syslog_main;
215
216 return (sm->severity_filter < s);
217}
218
219#endif /* __included_syslog_h__ */
220
221/*
222 * fd.io coding-style-patch-verification: ON
223 *
224 * Local Variables:
225 * eval: (c-set-style "gnu")
226 * End:
227 */