4809af48e97206aa92427fca7c789205e3cc15ec
[vpp.git] / src / vnet / syslog / syslog.h
1 /*
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 /**
16  * @file syslog.h
17  * RFC5424 syslog protocol declarations
18  */
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
51 typedef 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
69 typedef 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 */
77 typedef 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 */
96 typedef 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
109 typedef 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 */
139   vlib_main_t *vlib_main;
140   vnet_main_t *vnet_main;
141 } syslog_main_t;
142
143 extern syslog_main_t syslog_main;
144
145 /**
146  * @brief Initialize syslog message header
147  *
148  * @param facility facility value
149  * @param severity severity level
150  * @param app_name application that originated message RFC424 6.2.5. (optional)
151  * @param msgid identify the type of message RFC5424 6.2.7. (optional)
152  */
153 void syslog_msg_init (syslog_msg_t * syslog_msg, syslog_facility_t facility,
154                       syslog_severity_t severity, char *app_name,
155                       char *msgid);
156 /**
157  * @brief Initialize structured data element
158  *
159  * @param sd_id structured data element name RFC5424 6.3.2.
160  */
161 void syslog_msg_sd_init (syslog_msg_t * syslog_msg, char *sd_id);
162
163 /**
164  * @brief Add structured data elemnt parameter name-value pair RFC5424 6.3.3.
165  */
166 void syslog_msg_add_sd_param (syslog_msg_t * syslog_msg, char *name,
167                               char *fmt, ...);
168
169 /**
170  * @brief Add free-form message RFC5424 6.4.
171  */
172 void syslog_msg_add_msg (syslog_msg_t * syslog_msg, char *fmt, ...);
173
174 /**
175  * @brief Send syslog message
176  */
177 int syslog_msg_send (syslog_msg_t * syslog_msg);
178
179 /**
180  * @brief Set syslog sender configuration
181  *
182  * @param collector IPv4 address of syslog collector (destination)
183  * @param collector_port UDP port of syslog colector (destination)
184  * @param src IPv4 address of syslog sender (source)
185  * @param vrf_id VRF/FIB table ID
186  * @param max_msg_size maximum message length
187  */
188 vnet_api_error_t set_syslog_sender (ip4_address_t * collector,
189                                     u16 collector_port, ip4_address_t * src,
190                                     u32 vrf_id, u32 max_msg_size);
191
192 /**
193  * @brief Check if syslog logging is enabled
194  *
195  * @return 1 if syslog logging is enabled, 0 otherwise
196  */
197 always_inline int
198 syslog_is_enabled (void)
199 {
200   syslog_main_t *sm = &syslog_main;
201
202   return sm->collector.as_u32 ? 1 : 0;
203 }
204
205 /**
206  * @brief Severity filter test
207  *
208  * @return 1 if message with specified severity is not selected to be logged
209  */
210 always_inline int
211 syslog_severity_filter_block (syslog_severity_t s)
212 {
213   syslog_main_t *sm = &syslog_main;
214
215   return (sm->severity_filter < s);
216 }
217
218 #endif /* __included_syslog_h__ */
219
220 /*
221  * fd.io coding-style-patch-verification: ON
222  *
223  * Local Variables:
224  * eval: (c-set-style "gnu")
225  * End:
226  */