nat: static mappings in flow hash
[vpp.git] / src / plugins / nat / lib / nat_syslog.c
1 /*
2  * Copyright (c) 2020 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
17  * @brief NAT syslog logging
18  */
19 #include <vnet/fib/fib_table.h>
20 #include <vnet/ip/ip.h>
21 #include <vnet/syslog/syslog.h>
22
23 #include <nat/lib/nat_syslog.h>
24 #include <nat/lib/inlines.h>
25
26 #include <nat/lib/nat_syslog_constants.h>
27
28 static inline void
29 nat_syslog_nat44_apmap (u32 ssubix, u32 sfibix, ip4_address_t * isaddr,
30                         u16 isport, ip4_address_t * xsaddr, u16 xsport,
31                         nat_protocol_t proto, u8 is_add,
32                         ip6_address_t * sv6enc)
33 {
34   syslog_msg_t syslog_msg;
35   fib_table_t *fib;
36
37   if (!syslog_is_enabled ())
38     return;
39
40   if (syslog_severity_filter_block (APMADD_APMDEL_SEVERITY))
41     return;
42
43   syslog_msg_init (&syslog_msg, NAT_FACILITY, APMADD_APMDEL_SEVERITY,
44                    NAT_APPNAME, is_add ? APMADD_MSGID : APMDEL_MSGID);
45
46   syslog_msg_sd_init (&syslog_msg, NAPMAP_SDID);
47   syslog_msg_add_sd_param (&syslog_msg, SSUBIX_SDPARAM_NAME, "%d", ssubix);
48   if (sv6enc)
49     {
50       syslog_msg_add_sd_param (&syslog_msg, SV6ENC_SDPARAM_NAME, "%U",
51                                format_ip6_address, sv6enc);
52     }
53   else
54     {
55       fib = fib_table_get (sfibix, FIB_PROTOCOL_IP4);
56       syslog_msg_add_sd_param (&syslog_msg, SVLAN_SDPARAM_NAME, "%d",
57                                fib->ft_table_id);
58     }
59   syslog_msg_add_sd_param (&syslog_msg, IATYP_SDPARAM_NAME, IATYP_IPV4);
60   syslog_msg_add_sd_param (&syslog_msg, ISADDR_SDPARAM_NAME, "%U",
61                            format_ip4_address, isaddr);
62   syslog_msg_add_sd_param (&syslog_msg, ISPORT_SDPARAM_NAME, "%d",
63                            clib_net_to_host_u16 (isport));
64   syslog_msg_add_sd_param (&syslog_msg, XATYP_SDPARAM_NAME, IATYP_IPV4);
65   syslog_msg_add_sd_param (&syslog_msg, XSADDR_SDPARAM_NAME, "%U",
66                            format_ip4_address, xsaddr);
67   syslog_msg_add_sd_param (&syslog_msg, XSPORT_SDPARAM_NAME, "%d",
68                            clib_net_to_host_u16 (xsport));
69   syslog_msg_add_sd_param (&syslog_msg, PROTO_SDPARAM_NAME, "%d",
70                            nat_proto_to_ip_proto (proto));
71
72   syslog_msg_send (&syslog_msg);
73 }
74
75 void
76 nat_syslog_nat44_apmadd (u32 ssubix, u32 sfibix, ip4_address_t * isaddr,
77                          u16 isport, ip4_address_t * xsaddr, u16 xsport,
78                          nat_protocol_t proto)
79 {
80   nat_syslog_nat44_apmap (ssubix, sfibix, isaddr, isport, xsaddr, xsport,
81                           proto, 1, 0);
82 }
83
84 void
85 nat_syslog_nat44_apmdel (u32 ssubix, u32 sfibix, ip4_address_t * isaddr,
86                          u16 isport, ip4_address_t * xsaddr, u16 xsport,
87                          nat_protocol_t proto)
88 {
89   nat_syslog_nat44_apmap (ssubix, sfibix, isaddr, isport, xsaddr, xsport,
90                           proto, 0, 0);
91 }
92
93 void
94 nat_syslog_dslite_apmadd (u32 ssubix, ip6_address_t * sv6enc,
95                           ip4_address_t * isaddr, u16 isport,
96                           ip4_address_t * xsaddr, u16 xsport,
97                           nat_protocol_t proto)
98 {
99   nat_syslog_nat44_apmap (ssubix, 0, isaddr, isport, xsaddr, xsport,
100                           proto, 1, sv6enc);
101 }
102
103 void
104 nat_syslog_dslite_apmdel (u32 ssubix, ip6_address_t * sv6enc,
105                           ip4_address_t * isaddr, u16 isport,
106                           ip4_address_t * xsaddr, u16 xsport,
107                           nat_protocol_t proto)
108 {
109   nat_syslog_nat44_apmap (ssubix, 0, isaddr, isport, xsaddr, xsport,
110                           proto, 0, sv6enc);
111 }
112
113 static inline void
114 nat_syslog_nat64_sess (u32 sfibix, ip6_address_t * isaddr, u16 isport,
115                        ip4_address_t * xsaddr, u16 xsport,
116                        ip4_address_t * xdaddr, u16 xdport,
117                        nat_protocol_t proto, u8 is_add)
118 {
119   syslog_msg_t syslog_msg;
120   fib_table_t *fib;
121
122   if (!syslog_is_enabled ())
123     return;
124
125   if (syslog_severity_filter_block (SADD_SDEL_SEVERITY))
126     return;
127
128   fib = fib_table_get (sfibix, FIB_PROTOCOL_IP6);
129
130   syslog_msg_init (&syslog_msg, NAT_FACILITY, SADD_SDEL_SEVERITY, NAT_APPNAME,
131                    is_add ? SADD_MSGID : SDEL_MSGID);
132
133   syslog_msg_sd_init (&syslog_msg, NSESS_SDID);
134   syslog_msg_add_sd_param (&syslog_msg, SVLAN_SDPARAM_NAME, "%d",
135                            fib->ft_table_id);
136   syslog_msg_add_sd_param (&syslog_msg, IATYP_SDPARAM_NAME, IATYP_IPV6);
137   syslog_msg_add_sd_param (&syslog_msg, ISADDR_SDPARAM_NAME, "%U",
138                            format_ip6_address, isaddr);
139   syslog_msg_add_sd_param (&syslog_msg, ISPORT_SDPARAM_NAME, "%d",
140                            clib_net_to_host_u16 (isport));
141   syslog_msg_add_sd_param (&syslog_msg, XATYP_SDPARAM_NAME, IATYP_IPV4);
142   syslog_msg_add_sd_param (&syslog_msg, XSADDR_SDPARAM_NAME, "%U",
143                            format_ip4_address, xsaddr);
144   syslog_msg_add_sd_param (&syslog_msg, XSPORT_SDPARAM_NAME, "%d",
145                            clib_net_to_host_u16 (xsport));
146   syslog_msg_add_sd_param (&syslog_msg, PROTO_SDPARAM_NAME, "%d", proto);
147   syslog_msg_add_sd_param (&syslog_msg, XDADDR_SDPARAM_NAME, "%U",
148                            format_ip4_address, xdaddr);
149   syslog_msg_add_sd_param (&syslog_msg, XDPORT_SDPARAM_NAME, "%d",
150                            clib_net_to_host_u16 (xdport));
151
152   syslog_msg_send (&syslog_msg);
153 }
154
155 void
156 nat_syslog_nat64_sadd (u32 sfibix, ip6_address_t * isaddr, u16 isport,
157                        ip4_address_t * xsaddr, u16 xsport,
158                        ip4_address_t * xdaddr, u16 xdport,
159                        nat_protocol_t proto)
160 {
161   nat_syslog_nat64_sess (sfibix, isaddr, isport, xsaddr, xsport, xdaddr,
162                          xdport, proto, 1);
163 }
164
165 void
166 nat_syslog_nat64_sdel (u32 sfibix, ip6_address_t * isaddr, u16 isport,
167                        ip4_address_t * xsaddr, u16 xsport,
168                        ip4_address_t * xdaddr, u16 xdport,
169                        nat_protocol_t proto)
170 {
171   nat_syslog_nat64_sess (sfibix, isaddr, isport, xsaddr, xsport, xdaddr,
172                          xdport, proto, 0);
173 }
174
175 /*
176  * fd.io coding-style-patch-verification: ON
177  *
178  * Local Variables:
179  * eval: (c-set-style "gnu")
180  * End:
181  */