* limitations under the License.
*/
-#include <vnet/flow/flow_report.h>
+#include <vnet/ipfix-export/flow_report.h>
#include <vlibmemory/api.h>
+#include <nat/nat_inlines.h>
#include <nat/nat_ipfix_logging.h>
snat_ipfix_logging_main_t snat_ipfix_logging_main;
flow_report_t * fr,
ip4_address_t * collector_address,
ip4_address_t * src_address,
- u16 collector_port)
+ u16 collector_port,
+ ipfix_report_element_t *elts,
+ u32 n_elts, u32 *stream_index)
{
return snat_template_rewrite (frm, fr, collector_address, src_address,
collector_port, NAT_ADDRESSES_EXHAUTED, 0);
flow_report_t * fr,
ip4_address_t * collector_address,
ip4_address_t * src_address,
- u16 collector_port)
+ u16 collector_port,
+ ipfix_report_element_t *elts,
+ u32 n_elts, u32 *stream_index)
{
return snat_template_rewrite (frm, fr, collector_address, src_address,
collector_port, NAT44_SESSION_CREATE, 0);
flow_report_t * fr,
ip4_address_t * collector_address,
ip4_address_t * src_address,
- u16 collector_port)
+ u16 collector_port,
+ ipfix_report_element_t *elts,
+ u32 n_elts, u32 *stream_index)
{
return snat_template_rewrite (frm, fr, collector_address, src_address,
collector_port, QUOTA_EXCEEDED,
flow_report_t * fr,
ip4_address_t * collector_address,
ip4_address_t * src_address,
- u16 collector_port)
+ u16 collector_port,
+ ipfix_report_element_t *elts,
+ u32 n_elts, u32 *stream_index)
{
return snat_template_rewrite (frm, fr, collector_address, src_address,
collector_port, QUOTA_EXCEEDED,
flow_report_t * fr,
ip4_address_t * collector_address,
ip4_address_t * src_address,
- u16 collector_port)
+ u16 collector_port,
+ ipfix_report_element_t *elts,
+ u32 n_elts, u32 *stream_index)
{
return snat_template_rewrite (frm, fr, collector_address, src_address,
collector_port, QUOTA_EXCEEDED,
flow_report_t * fr,
ip4_address_t * collector_address,
ip4_address_t * src_address,
- u16 collector_port)
+ u16 collector_port,
+ ipfix_report_element_t *elts,
+ u32 n_elts, u32 *stream_index)
{
return snat_template_rewrite (frm, fr, collector_address, src_address,
collector_port, QUOTA_EXCEEDED,
flow_report_t * fr,
ip4_address_t * collector_address,
ip4_address_t * src_address,
- u16 collector_port)
+ u16 collector_port,
+ ipfix_report_element_t *elts,
+ u32 n_elts, u32 *stream_index)
{
return snat_template_rewrite (frm, fr, collector_address, src_address,
collector_port, QUOTA_EXCEEDED,
flow_report_t * fr,
ip4_address_t * collector_address,
ip4_address_t * src_address,
- u16 collector_port)
+ u16 collector_port,
+ ipfix_report_element_t *elts,
+ u32 n_elts, u32 *stream_index)
{
return snat_template_rewrite (frm, fr, collector_address, src_address,
collector_port, NAT64_BIB_CREATE, 0);
flow_report_t * fr,
ip4_address_t * collector_address,
ip4_address_t * src_address,
- u16 collector_port)
+ u16 collector_port,
+ ipfix_report_element_t *elts,
+ u32 n_elts, u32 *stream_index)
{
return snat_template_rewrite (frm, fr, collector_address, src_address,
collector_port, NAT64_SESSION_CREATE, 0);
b0->current_data = 0;
b0->current_length = sizeof (*ip) + sizeof (*udp) + sizeof (*h) +
sizeof (*s);
- b0->flags |= (VLIB_BUFFER_TOTAL_LENGTH_VALID | VLIB_BUFFER_FLOW_REPORT);
+ b0->flags |= (VLIB_BUFFER_TOTAL_LENGTH_VALID | VNET_BUFFER_F_FLOW_REPORT);
vnet_buffer (b0)->sw_if_index[VLIB_RX] = 0;
vnet_buffer (b0)->sw_if_index[VLIB_TX] = frm->fib_index;
tp = vlib_buffer_get_current (b0);
if (vlib_buffer_alloc (vm, &bi0, 1) != 1)
{
- clib_warning ("can't allocate buffer for NAT IPFIX event");
+ nat_log_err ("can't allocate buffer for NAT IPFIX event");
return;
}
if (PREDICT_TRUE (do_flush == 0))
{
u64 time_stamp = clib_host_to_net_u64 (now);
- clib_memcpy (b0->data + offset, &time_stamp, sizeof (time_stamp));
+ clib_memcpy_fast (b0->data + offset, &time_stamp, sizeof (time_stamp));
offset += sizeof (time_stamp);
- clib_memcpy (b0->data + offset, &nat_event, sizeof (nat_event));
+ clib_memcpy_fast (b0->data + offset, &nat_event, sizeof (nat_event));
offset += sizeof (nat_event);
- clib_memcpy (b0->data + offset, &src_ip, sizeof (src_ip));
+ clib_memcpy_fast (b0->data + offset, &src_ip, sizeof (src_ip));
offset += sizeof (src_ip);
- clib_memcpy (b0->data + offset, &nat_src_ip, sizeof (nat_src_ip));
+ clib_memcpy_fast (b0->data + offset, &nat_src_ip, sizeof (nat_src_ip));
offset += sizeof (nat_src_ip);
- clib_memcpy (b0->data + offset, &proto, sizeof (proto));
+ clib_memcpy_fast (b0->data + offset, &proto, sizeof (proto));
offset += sizeof (proto);
- clib_memcpy (b0->data + offset, &src_port, sizeof (src_port));
+ clib_memcpy_fast (b0->data + offset, &src_port, sizeof (src_port));
offset += sizeof (src_port);
- clib_memcpy (b0->data + offset, &nat_src_port, sizeof (nat_src_port));
+ clib_memcpy_fast (b0->data + offset, &nat_src_port, sizeof (nat_src_port));
offset += sizeof (nat_src_port);
- clib_memcpy (b0->data + offset, &vrf_id, sizeof (vrf_id));
+ clib_memcpy_fast (b0->data + offset, &vrf_id, sizeof (vrf_id));
offset += sizeof (vrf_id);
b0->current_length += NAT44_SESSION_CREATE_LEN;
if (vlib_buffer_alloc (vm, &bi0, 1) != 1)
{
- clib_warning ("can't allocate buffer for NAT IPFIX event");
+ nat_log_err ("can't allocate buffer for NAT IPFIX event");
return;
}
if (PREDICT_TRUE (do_flush == 0))
{
u64 time_stamp = clib_host_to_net_u64 (now);
- clib_memcpy (b0->data + offset, &time_stamp, sizeof (time_stamp));
+ clib_memcpy_fast (b0->data + offset, &time_stamp, sizeof (time_stamp));
offset += sizeof (time_stamp);
- clib_memcpy (b0->data + offset, &nat_event, sizeof (nat_event));
+ clib_memcpy_fast (b0->data + offset, &nat_event, sizeof (nat_event));
offset += sizeof (nat_event);
- clib_memcpy (b0->data + offset, &pool_id, sizeof (pool_id));
+ clib_memcpy_fast (b0->data + offset, &pool_id, sizeof (pool_id));
offset += sizeof (pool_id);
b0->current_length += NAT_ADDRESSES_EXHAUTED_LEN;
if (vlib_buffer_alloc (vm, &bi0, 1) != 1)
{
- clib_warning ("can't allocate buffer for NAT IPFIX event");
+ nat_log_err ("can't allocate buffer for NAT IPFIX event");
return;
}
if (PREDICT_TRUE (do_flush == 0))
{
u64 time_stamp = clib_host_to_net_u64 (now);
- clib_memcpy (b0->data + offset, &time_stamp, sizeof (time_stamp));
+ clib_memcpy_fast (b0->data + offset, &time_stamp, sizeof (time_stamp));
offset += sizeof (time_stamp);
- clib_memcpy (b0->data + offset, &nat_event, sizeof (nat_event));
+ clib_memcpy_fast (b0->data + offset, &nat_event, sizeof (nat_event));
offset += sizeof (nat_event);
- clib_memcpy (b0->data + offset, "a_event, sizeof (quota_event));
+ clib_memcpy_fast (b0->data + offset, "a_event, sizeof (quota_event));
offset += sizeof (quota_event);
- clib_memcpy (b0->data + offset, &limit, sizeof (limit));
+ clib_memcpy_fast (b0->data + offset, &limit, sizeof (limit));
offset += sizeof (limit);
- clib_memcpy (b0->data + offset, &src_ip, sizeof (src_ip));
+ clib_memcpy_fast (b0->data + offset, &src_ip, sizeof (src_ip));
offset += sizeof (src_ip);
b0->current_length += MAX_ENTRIES_PER_USER_LEN;
if (vlib_buffer_alloc (vm, &bi0, 1) != 1)
{
- clib_warning ("can't allocate buffer for NAT IPFIX event");
+ nat_log_err ("can't allocate buffer for NAT IPFIX event");
return;
}
if (PREDICT_TRUE (do_flush == 0))
{
u64 time_stamp = clib_host_to_net_u64 (now);
- clib_memcpy (b0->data + offset, &time_stamp, sizeof (time_stamp));
+ clib_memcpy_fast (b0->data + offset, &time_stamp, sizeof (time_stamp));
offset += sizeof (time_stamp);
- clib_memcpy (b0->data + offset, &nat_event, sizeof (nat_event));
+ clib_memcpy_fast (b0->data + offset, &nat_event, sizeof (nat_event));
offset += sizeof (nat_event);
- clib_memcpy (b0->data + offset, "a_event, sizeof (quota_event));
+ clib_memcpy_fast (b0->data + offset, "a_event, sizeof (quota_event));
offset += sizeof (quota_event);
- clib_memcpy (b0->data + offset, &limit, sizeof (limit));
+ clib_memcpy_fast (b0->data + offset, &limit, sizeof (limit));
offset += sizeof (limit);
b0->current_length += MAX_SESSIONS_LEN;
if (vlib_buffer_alloc (vm, &bi0, 1) != 1)
{
- clib_warning ("can't allocate buffer for NAT IPFIX event");
+ nat_log_err ("can't allocate buffer for NAT IPFIX event");
return;
}
if (PREDICT_TRUE (do_flush == 0))
{
u64 time_stamp = clib_host_to_net_u64 (now);
- clib_memcpy (b0->data + offset, &time_stamp, sizeof (time_stamp));
+ clib_memcpy_fast (b0->data + offset, &time_stamp, sizeof (time_stamp));
offset += sizeof (time_stamp);
- clib_memcpy (b0->data + offset, &nat_event, sizeof (nat_event));
+ clib_memcpy_fast (b0->data + offset, &nat_event, sizeof (nat_event));
offset += sizeof (nat_event);
- clib_memcpy (b0->data + offset, "a_event, sizeof (quota_event));
+ clib_memcpy_fast (b0->data + offset, "a_event, sizeof (quota_event));
offset += sizeof (quota_event);
- clib_memcpy (b0->data + offset, &limit, sizeof (limit));
+ clib_memcpy_fast (b0->data + offset, &limit, sizeof (limit));
offset += sizeof (limit);
b0->current_length += MAX_BIBS_LEN;
if (vlib_buffer_alloc (vm, &bi0, 1) != 1)
{
- clib_warning ("can't allocate buffer for NAT IPFIX event");
+ nat_log_err ("can't allocate buffer for NAT IPFIX event");
return;
}
if (PREDICT_TRUE (do_flush == 0))
{
u64 time_stamp = clib_host_to_net_u64 (now);
- clib_memcpy (b0->data + offset, &time_stamp, sizeof (time_stamp));
+ clib_memcpy_fast (b0->data + offset, &time_stamp, sizeof (time_stamp));
offset += sizeof (time_stamp);
- clib_memcpy (b0->data + offset, &nat_event, sizeof (nat_event));
+ clib_memcpy_fast (b0->data + offset, &nat_event, sizeof (nat_event));
offset += sizeof (nat_event);
- clib_memcpy (b0->data + offset, "a_event, sizeof (quota_event));
+ clib_memcpy_fast (b0->data + offset, "a_event, sizeof (quota_event));
offset += sizeof (quota_event);
- clib_memcpy (b0->data + offset, &limit, sizeof (limit));
+ clib_memcpy_fast (b0->data + offset, &limit, sizeof (limit));
offset += sizeof (limit);
- clib_memcpy (b0->data + offset, &src, sizeof (src));
+ clib_memcpy_fast (b0->data + offset, &src, sizeof (src));
offset += sizeof (src);
b0->current_length += MAX_FRAGMENTS_IP4_LEN;
if (vlib_buffer_alloc (vm, &bi0, 1) != 1)
{
- clib_warning ("can't allocate buffer for NAT IPFIX event");
+ nat_log_err ("can't allocate buffer for NAT IPFIX event");
return;
}
if (PREDICT_TRUE (do_flush == 0))
{
u64 time_stamp = clib_host_to_net_u64 (now);
- clib_memcpy (b0->data + offset, &time_stamp, sizeof (time_stamp));
+ clib_memcpy_fast (b0->data + offset, &time_stamp, sizeof (time_stamp));
offset += sizeof (time_stamp);
- clib_memcpy (b0->data + offset, &nat_event, sizeof (nat_event));
+ clib_memcpy_fast (b0->data + offset, &nat_event, sizeof (nat_event));
offset += sizeof (nat_event);
- clib_memcpy (b0->data + offset, "a_event, sizeof (quota_event));
+ clib_memcpy_fast (b0->data + offset, "a_event, sizeof (quota_event));
offset += sizeof (quota_event);
- clib_memcpy (b0->data + offset, &limit, sizeof (limit));
+ clib_memcpy_fast (b0->data + offset, &limit, sizeof (limit));
offset += sizeof (limit);
- clib_memcpy (b0->data + offset, src, sizeof (ip6_address_t));
+ clib_memcpy_fast (b0->data + offset, src, sizeof (ip6_address_t));
offset += sizeof (ip6_address_t);
b0->current_length += MAX_FRAGMENTS_IP6_LEN;
if (vlib_buffer_alloc (vm, &bi0, 1) != 1)
{
- clib_warning ("can't allocate buffer for NAT IPFIX event");
+ nat_log_err ("can't allocate buffer for NAT IPFIX event");
return;
}
if (PREDICT_TRUE (do_flush == 0))
{
u64 time_stamp = clib_host_to_net_u64 (now);
- clib_memcpy (b0->data + offset, &time_stamp, sizeof (time_stamp));
+ clib_memcpy_fast (b0->data + offset, &time_stamp, sizeof (time_stamp));
offset += sizeof (time_stamp);
- clib_memcpy (b0->data + offset, &nat_event, sizeof (nat_event));
+ clib_memcpy_fast (b0->data + offset, &nat_event, sizeof (nat_event));
offset += sizeof (nat_event);
- clib_memcpy (b0->data + offset, src_ip, sizeof (ip6_address_t));
+ clib_memcpy_fast (b0->data + offset, src_ip, sizeof (ip6_address_t));
offset += sizeof (ip6_address_t);
- clib_memcpy (b0->data + offset, &nat_src_ip, sizeof (nat_src_ip));
+ clib_memcpy_fast (b0->data + offset, &nat_src_ip, sizeof (nat_src_ip));
offset += sizeof (nat_src_ip);
- clib_memcpy (b0->data + offset, &proto, sizeof (proto));
+ clib_memcpy_fast (b0->data + offset, &proto, sizeof (proto));
offset += sizeof (proto);
- clib_memcpy (b0->data + offset, &src_port, sizeof (src_port));
+ clib_memcpy_fast (b0->data + offset, &src_port, sizeof (src_port));
offset += sizeof (src_port);
- clib_memcpy (b0->data + offset, &nat_src_port, sizeof (nat_src_port));
+ clib_memcpy_fast (b0->data + offset, &nat_src_port, sizeof (nat_src_port));
offset += sizeof (nat_src_port);
- clib_memcpy (b0->data + offset, &vrf_id, sizeof (vrf_id));
+ clib_memcpy_fast (b0->data + offset, &vrf_id, sizeof (vrf_id));
offset += sizeof (vrf_id);
b0->current_length += NAT64_BIB_LEN;
if (vlib_buffer_alloc (vm, &bi0, 1) != 1)
{
- clib_warning ("can't allocate buffer for NAT IPFIX event");
+ nat_log_err ("can't allocate buffer for NAT IPFIX event");
return;
}
if (PREDICT_TRUE (do_flush == 0))
{
u64 time_stamp = clib_host_to_net_u64 (now);
- clib_memcpy (b0->data + offset, &time_stamp, sizeof (time_stamp));
+ clib_memcpy_fast (b0->data + offset, &time_stamp, sizeof (time_stamp));
offset += sizeof (time_stamp);
- clib_memcpy (b0->data + offset, &nat_event, sizeof (nat_event));
+ clib_memcpy_fast (b0->data + offset, &nat_event, sizeof (nat_event));
offset += sizeof (nat_event);
- clib_memcpy (b0->data + offset, src_ip, sizeof (ip6_address_t));
+ clib_memcpy_fast (b0->data + offset, src_ip, sizeof (ip6_address_t));
offset += sizeof (ip6_address_t);
- clib_memcpy (b0->data + offset, &nat_src_ip, sizeof (nat_src_ip));
+ clib_memcpy_fast (b0->data + offset, &nat_src_ip, sizeof (nat_src_ip));
offset += sizeof (nat_src_ip);
- clib_memcpy (b0->data + offset, &proto, sizeof (proto));
+ clib_memcpy_fast (b0->data + offset, &proto, sizeof (proto));
offset += sizeof (proto);
- clib_memcpy (b0->data + offset, &src_port, sizeof (src_port));
+ clib_memcpy_fast (b0->data + offset, &src_port, sizeof (src_port));
offset += sizeof (src_port);
- clib_memcpy (b0->data + offset, &nat_src_port, sizeof (nat_src_port));
+ clib_memcpy_fast (b0->data + offset, &nat_src_port, sizeof (nat_src_port));
offset += sizeof (nat_src_port);
- clib_memcpy (b0->data + offset, dst_ip, sizeof (ip6_address_t));
+ clib_memcpy_fast (b0->data + offset, dst_ip, sizeof (ip6_address_t));
offset += sizeof (ip6_address_t);
- clib_memcpy (b0->data + offset, &nat_dst_ip, sizeof (nat_dst_ip));
+ clib_memcpy_fast (b0->data + offset, &nat_dst_ip, sizeof (nat_dst_ip));
offset += sizeof (nat_dst_ip);
- clib_memcpy (b0->data + offset, &dst_port, sizeof (dst_port));
+ clib_memcpy_fast (b0->data + offset, &dst_port, sizeof (dst_port));
offset += sizeof (dst_port);
- clib_memcpy (b0->data + offset, &nat_dst_port, sizeof (nat_dst_port));
+ clib_memcpy_fast (b0->data + offset, &nat_dst_port, sizeof (nat_dst_port));
offset += sizeof (nat_dst_port);
- clib_memcpy (b0->data + offset, &vrf_id, sizeof (vrf_id));
+ clib_memcpy_fast (b0->data + offset, &vrf_id, sizeof (vrf_id));
offset += sizeof (vrf_id);
b0->current_length += NAT64_SES_LEN;
silm->enabled = e;
- memset (&a, 0, sizeof (a));
+ clib_memset (&a, 0, sizeof (a));
a.is_add = enable;
a.domain_id = domain_id ? domain_id : 1;
a.src_port = src_port ? src_port : UDP_DST_PORT_ipfix;
rv = vnet_flow_report_add_del (frm, &a, NULL);
if (rv)
{
- clib_warning ("vnet_flow_report_add_del returned %d", rv);
+ nat_log_warn ("vnet_flow_report_add_del returned %d", rv);
return -1;
}
}
rv = vnet_flow_report_add_del (frm, &a, NULL);
if (rv)
{
- clib_warning ("vnet_flow_report_add_del returned %d", rv);
+ nat_log_warn ("vnet_flow_report_add_del returned %d", rv);
return -1;
}
rv = vnet_flow_report_add_del (frm, &a, NULL);
if (rv)
{
- clib_warning ("vnet_flow_report_add_del returned %d", rv);
+ nat_log_warn ("vnet_flow_report_add_del returned %d", rv);
return -1;
}
rv = vnet_flow_report_add_del (frm, &a, NULL);
if (rv)
{
- clib_warning ("vnet_flow_report_add_del returned %d", rv);
+ nat_log_warn ("vnet_flow_report_add_del returned %d", rv);
return -1;
}
rv = vnet_flow_report_add_del (frm, &a, NULL);
if (rv)
{
- clib_warning ("vnet_flow_report_add_del returned %d", rv);
+ nat_log_warn ("vnet_flow_report_add_del returned %d", rv);
return -1;
}
rv = vnet_flow_report_add_del (frm, &a, NULL);
if (rv)
{
- clib_warning ("vnet_flow_report_add_del returned %d", rv);
+ nat_log_warn ("vnet_flow_report_add_del returned %d", rv);
return -1;
}
rv = vnet_flow_report_add_del (frm, &a, NULL);
if (rv)
{
- clib_warning ("vnet_flow_report_add_del returned %d", rv);
+ nat_log_warn ("vnet_flow_report_add_del returned %d", rv);
return -1;
}
rv = vnet_flow_report_add_del (frm, &a, NULL);
if (rv)
{
- clib_warning ("vnet_flow_report_add_del returned %d", rv);
+ nat_log_warn ("vnet_flow_report_add_del returned %d", rv);
return -1;
}
rv = vnet_flow_report_add_del (frm, &a, NULL);
if (rv)
{
- clib_warning ("vnet_flow_report_add_del returned %d", rv);
+ nat_log_warn ("vnet_flow_report_add_del returned %d", rv);
return -1;
}
+
+ if (sm->endpoint_dependent)
+ {
+ a.rewrite_callback = snat_template_rewrite_max_entries_per_usr;
+ a.flow_data_callback = snat_data_callback_max_entries_per_usr;
+
+ rv = vnet_flow_report_add_del (frm, &a, NULL);
+ if (rv)
+ {
+ nat_log_warn ("vnet_flow_report_add_del returned %d", rv);
+ return -1;
+ }
+ }
}
return 0;