diff --git a/src/plugins/nat/lib/ipfix_logging.c b/src/plugins/nat/lib/ipfix_logging.c index f569ccd19..8dc9eb789 100644 --- a/src/plugins/nat/lib/ipfix_logging.c +++ b/src/plugins/nat/lib/ipfix_logging.c @@ -26,7 +26,7 @@ vlib_node_registration_t nat_ipfix_flush_node; nat_ipfix_logging_main_t nat_ipfix_logging_main; -#define NAT44_SESSION_CREATE_LEN 26 +#define NAT44_SESSION_CREATE_LEN 38 #define NAT_ADDRESSES_EXHAUTED_LEN 13 #define MAX_ENTRIES_PER_USER_LEN 21 #define MAX_SESSIONS_LEN 17 @@ -36,7 +36,7 @@ nat_ipfix_logging_main_t nat_ipfix_logging_main; #define NAT64_BIB_LEN 38 #define NAT64_SES_LEN 62 -#define NAT44_SESSION_CREATE_FIELD_COUNT 8 +#define NAT44_SESSION_CREATE_FIELD_COUNT 12 #define NAT_ADDRESSES_EXHAUTED_FIELD_COUNT 3 #define MAX_ENTRIES_PER_USER_FIELD_COUNT 5 #define MAX_SESSIONS_FIELD_COUNT 4 @@ -54,6 +54,10 @@ typedef struct u16 src_port; u16 nat_src_port; u32 vrf_id; + u32 dst_ip; + u32 nat_dst_ip; + u16 dst_port; + u16 nat_dst_port; } nat_ipfix_logging_nat44_ses_args_t; typedef struct @@ -274,6 +278,14 @@ nat_template_rewrite (ipfix_exporter_t *exp, flow_report_t *fr, f++; f->e_id_length = ipfix_e_id_length (0, ingressVRFID, 4); f++; + f->e_id_length = ipfix_e_id_length (0, destinationIPv4Address, 4); + f++; + f->e_id_length = ipfix_e_id_length (0, postNATDestinationIPv4Address, 4); + f++; + f->e_id_length = ipfix_e_id_length (0, destinationTransportPort, 2); + f++; + f->e_id_length = ipfix_e_id_length (0, postNAPTDestinationTransportPort, 2); + f++; } else if (event == NAT64_BIB_CREATE) { @@ -551,7 +563,9 @@ nat_ipfix_send (flow_report_main_t *frm, vlib_frame_t *f, vlib_buffer_t *b0, static void nat_ipfix_logging_nat44_ses (u32 thread_index, u8 nat_event, u32 src_ip, u32 nat_src_ip, ip_protocol_t proto, u16 src_port, - u16 nat_src_port, u32 fib_index, int do_flush) + u16 nat_src_port, u32 fib_index, u32 dst_ip, + u32 nat_dst_ip, u16 dst_port, u16 nat_dst_port, + int do_flush) { nat_ipfix_logging_main_t *silm = &nat_ipfix_logging_main; nat_ipfix_per_thread_data_t *sitd = &silm->per_thread_data[thread_index]; @@ -634,6 +648,28 @@ nat_ipfix_logging_nat44_ses (u32 thread_index, u8 nat_event, u32 src_ip, clib_memcpy_fast (b0->data + offset, &vrf_id, sizeof (vrf_id)); offset += sizeof (vrf_id); + clib_memcpy_fast (b0->data + offset, &dst_ip, sizeof (dst_ip)); + offset += sizeof (dst_ip); + + if (nat_dst_ip) { + clib_memcpy_fast (b0->data + offset, &nat_dst_ip, sizeof (nat_dst_ip)); + offset += sizeof (nat_dst_ip); + } else { + clib_memcpy_fast (b0->data + offset, &dst_ip, sizeof (dst_ip)); + offset += sizeof (dst_ip); + } + + clib_memcpy_fast (b0->data + offset, &dst_port, sizeof (dst_port)); + offset += sizeof (dst_port); + + if (nat_dst_port) { + clib_memcpy_fast (b0->data + offset, &nat_dst_port, sizeof (nat_dst_port)); + offset += sizeof (nat_dst_port); + } else { + clib_memcpy_fast (b0->data + offset, &dst_port, sizeof (dst_port)); + offset += sizeof (dst_port); + } + b0->current_length += NAT44_SESSION_CREATE_LEN; } @@ -1226,7 +1262,7 @@ nat_ipfix_flush (u32 thread_index) int do_flush = 1; nat_ipfix_logging_nat44_ses (thread_index, - 0, 0, 0, 0, 0, 0, 0, do_flush); + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, do_flush); nat_ipfix_logging_addr_exhausted (thread_index, 0, do_flush); nat_ipfix_logging_max_entries_per_usr (thread_index, 0, 0, do_flush); nat_ipfix_logging_max_ses (thread_index, 0, do_flush); @@ -1284,13 +1320,15 @@ void nat_ipfix_logging_nat44_ses_create (u32 thread_index, u32 src_ip, u32 nat_src_ip, ip_protocol_t proto, u16 src_port, u16 nat_src_port, - u32 fib_index) + u32 fib_index, u32 dst_ip, u32 nat_dst_ip, + u16 dst_port, u16 nat_dst_port) { skip_if_disabled (); nat_ipfix_logging_nat44_ses (thread_index, NAT44_SESSION_CREATE, src_ip, nat_src_ip, proto, src_port, nat_src_port, - fib_index, 0); + fib_index, dst_ip, nat_dst_ip, dst_port, nat_dst_port, + 0); } /** @@ -1300,13 +1338,15 @@ void nat_ipfix_logging_nat44_ses_delete (u32 thread_index, u32 src_ip, u32 nat_src_ip, ip_protocol_t proto, u16 src_port, u16 nat_src_port, - u32 fib_index) + u32 fib_index, u32 dst_ip, u32 nat_dst_ip, + u16 dst_port, u16 nat_dst_port) { skip_if_disabled (); nat_ipfix_logging_nat44_ses (thread_index, NAT44_SESSION_DELETE, src_ip, nat_src_ip, proto, src_port, nat_src_port, - fib_index, 0); + fib_index, dst_ip, nat_dst_ip, dst_port, nat_dst_port, + 0); } /** diff --git a/src/plugins/nat/lib/ipfix_logging.h b/src/plugins/nat/lib/ipfix_logging.h index dc7927a16..0bb73e48c 100644 --- a/src/plugins/nat/lib/ipfix_logging.h +++ b/src/plugins/nat/lib/ipfix_logging.h @@ -123,11 +123,13 @@ int nat_ipfix_logging_enable_disable (int enable, u32 domain_id, u16 src_port); void nat_ipfix_logging_nat44_ses_create (u32 thread_index, u32 src_ip, u32 nat_src_ip, ip_protocol_t proto, u16 src_port, u16 nat_src_port, - u32 fib_index); + u32 fib_index, u32 dst_ip, u32 nat_dst_ip, + u16 dst_port, u16 nat_dst_port); void nat_ipfix_logging_nat44_ses_delete (u32 thread_index, u32 src_ip, u32 nat_src_ip, ip_protocol_t proto, u16 src_port, u16 nat_src_port, - u32 fib_index); + u32 fib_index, u32 dst_ip, u32 nat_dst_ip, + u16 dst_port, u16 nat_dst_port); void nat_ipfix_logging_addresses_exhausted(u32 thread_index, u32 pool_id); void nat_ipfix_logging_max_entries_per_user(u32 thread_index, u32 limit, u32 src_ip); diff --git a/src/plugins/nat/nat44-ed/nat44_ed.c b/src/plugins/nat/nat44-ed/nat44_ed.c index 08e577747..a0a6695e4 100644 --- a/src/plugins/nat/nat44-ed/nat44_ed.c +++ b/src/plugins/nat/nat44-ed/nat44_ed.c @@ -236,7 +236,9 @@ nat44_ed_free_session_data (snat_main_t *sm, snat_session_t *s, /* log NAT event */ nat_ipfix_logging_nat44_ses_delete ( thread_index, s->in2out.addr.as_u32, s->out2in.addr.as_u32, s->proto, - s->in2out.port, s->out2in.port, s->in2out.fib_index); + s->in2out.port, s->out2in.port, s->in2out.fib_index, + s->ext_host_addr.as_u32, s->ext_host_nat_addr.as_u32, s->ext_host_port, + s->ext_host_nat_port); } } diff --git a/src/plugins/nat/nat44-ed/nat44_ed_in2out.c b/src/plugins/nat/nat44-ed/nat44_ed_in2out.c index 9b4dac3b3..4bcd8989d 100644 --- a/src/plugins/nat/nat44-ed/nat44_ed_in2out.c +++ b/src/plugins/nat/nat44-ed/nat44_ed_in2out.c @@ -606,7 +606,9 @@ slow_path_ed (vlib_main_t *vm, snat_main_t *sm, vlib_buffer_t *b, /* log NAT event */ nat_ipfix_logging_nat44_ses_create ( thread_index, s->in2out.addr.as_u32, s->out2in.addr.as_u32, s->proto, - s->in2out.port, s->out2in.port, s->in2out.fib_index); + s->in2out.port, s->out2in.port, s->in2out.fib_index, + s->ext_host_addr.as_u32, s->ext_host_nat_addr.as_u32, s->ext_host_port, + s->ext_host_nat_port); nat_syslog_nat44_sadd (0, s->in2out.fib_index, &s->in2out.addr, s->in2out.port, &s->ext_host_nat_addr, diff --git a/src/plugins/nat/nat44-ed/nat44_ed_inlines.h b/src/plugins/nat/nat44-ed/nat44_ed_inlines.h index 8cd93f263..f9db68ac9 100644 --- a/src/plugins/nat/nat44-ed/nat44_ed_inlines.h +++ b/src/plugins/nat/nat44-ed/nat44_ed_inlines.h @@ -711,10 +711,12 @@ nat44_ed_session_reopen (u32 thread_index, snat_session_t *s) nat_ipfix_logging_nat44_ses_delete ( thread_index, s->in2out.addr.as_u32, s->out2in.addr.as_u32, s->proto, - s->in2out.port, s->out2in.port, s->in2out.fib_index); + s->in2out.port, s->out2in.port, s->in2out.fib_index, s->ext_host_addr.as_u32, + s->ext_host_nat_addr.as_u32, s->ext_host_port, s->ext_host_nat_port); nat_ipfix_logging_nat44_ses_create ( thread_index, s->in2out.addr.as_u32, s->out2in.addr.as_u32, s->proto, - s->in2out.port, s->out2in.port, s->in2out.fib_index); + s->in2out.port, s->out2in.port, s->in2out.fib_index, s->ext_host_addr.as_u32, + s->ext_host_nat_addr.as_u32, s->ext_host_port, s->ext_host_nat_port); nat_syslog_nat44_sadd (0, s->in2out.fib_index, &s->in2out.addr, s->in2out.port, &s->ext_host_nat_addr, diff --git a/src/plugins/nat/nat44-ed/nat44_ed_out2in.c b/src/plugins/nat/nat44-ed/nat44_ed_out2in.c index fe4a41c5e..90f8987ab 100644 --- a/src/plugins/nat/nat44-ed/nat44_ed_out2in.c +++ b/src/plugins/nat/nat44-ed/nat44_ed_out2in.c @@ -543,7 +543,9 @@ create_session_for_static_mapping_ed ( } nat_ipfix_logging_nat44_ses_create ( thread_index, s->in2out.addr.as_u32, s->out2in.addr.as_u32, s->proto, - s->in2out.port, s->out2in.port, s->in2out.fib_index); + s->in2out.port, s->out2in.port, s->in2out.fib_index, + s->ext_host_addr.as_u32, s->ext_host_nat_addr.as_u32, s->ext_host_port, + s->ext_host_nat_port); nat_syslog_nat44_sadd (0, s->in2out.fib_index, &s->in2out.addr, s->in2out.port, &s->ext_host_nat_addr, diff --git a/src/plugins/nat/nat44-ei/nat44_ei.c b/src/plugins/nat/nat44-ei/nat44_ei.c index d1959f72a..07de34b13 100644 --- a/src/plugins/nat/nat44-ei/nat44_ei.c +++ b/src/plugins/nat/nat44-ei/nat44_ei.c @@ -1412,7 +1412,8 @@ nat44_ei_free_session_data_v2 (nat44_ei_main_t *nm, nat44_ei_session_t *s, nat_ipfix_logging_nat44_ses_delete ( thread_index, s->in2out.addr.as_u32, s->out2in.addr.as_u32, nat_proto_to_ip_proto (s->nat_proto), s->in2out.port, s->out2in.port, - s->in2out.fib_index); + s->in2out.fib_index, s->ext_host_addr.as_u32, + s->ext_host_nat_addr.as_u32, s->ext_host_port, s->ext_host_nat_port); nat_ha_sdel (&s->out2in.addr, s->out2in.port, &s->ext_host_addr, s->ext_host_port, s->nat_proto, s->out2in.fib_index, @@ -1581,7 +1582,8 @@ nat44_ei_free_session_data (nat44_ei_main_t *nm, nat44_ei_session_t *s, nat_ipfix_logging_nat44_ses_delete ( thread_index, s->in2out.addr.as_u32, s->out2in.addr.as_u32, nat_proto_to_ip_proto (s->nat_proto), s->in2out.port, s->out2in.port, - s->in2out.fib_index); + s->in2out.fib_index, s->ext_host_addr.as_u32, + s->ext_host_nat_addr.as_u32, s->ext_host_port, s->ext_host_nat_port); nat_ha_sdel (&s->out2in.addr, s->out2in.port, &s->ext_host_addr, s->ext_host_port, s->nat_proto, s->out2in.fib_index, diff --git a/src/plugins/nat/nat44-ei/nat44_ei_in2out.c b/src/plugins/nat/nat44-ei/nat44_ei_in2out.c index 2fbf2832d..747a18cb6 100644 --- a/src/plugins/nat/nat44-ei/nat44_ei_in2out.c +++ b/src/plugins/nat/nat44-ei/nat44_ei_in2out.c @@ -341,7 +341,8 @@ nat44_i2o_is_idle_session_cb (clib_bihash_kv_8_8_t * kv, void *arg) nat_ipfix_logging_nat44_ses_delete ( ctx->thread_index, s->in2out.addr.as_u32, s->out2in.addr.as_u32, nat_proto_to_ip_proto (s->nat_proto), s->in2out.port, s->out2in.port, - s->in2out.fib_index); + s->in2out.fib_index, s->ext_host_addr.as_u32, + s->ext_host_nat_addr.as_u32, s->ext_host_port, s->ext_host_nat_port); nat_syslog_nat44_apmdel (s->user_index, s->in2out.fib_index, &s->in2out.addr, s->in2out.port, @@ -496,7 +497,8 @@ slow_path (nat44_ei_main_t *nm, vlib_buffer_t *b0, ip4_header_t *ip0, nat_ipfix_logging_nat44_ses_create ( thread_index, s->in2out.addr.as_u32, s->out2in.addr.as_u32, nat_proto_to_ip_proto (s->nat_proto), s->in2out.port, s->out2in.port, - s->in2out.fib_index); + s->in2out.fib_index, s->ext_host_addr.as_u32, + s->ext_host_nat_addr.as_u32, s->ext_host_port, s->ext_host_nat_port); nat_syslog_nat44_apmadd (s->user_index, s->in2out.fib_index, &s->in2out.addr, s->in2out.port, &s->out2in.addr, s->out2in.port, diff --git a/src/plugins/nat/nat44-ei/nat44_ei_out2in.c b/src/plugins/nat/nat44-ei/nat44_ei_out2in.c index 805a69628..4c2407fc5 100644 --- a/src/plugins/nat/nat44-ei/nat44_ei_out2in.c +++ b/src/plugins/nat/nat44-ei/nat44_ei_out2in.c @@ -116,7 +116,8 @@ nat44_o2i_is_idle_session_cb (clib_bihash_kv_8_8_t * kv, void *arg) nat_ipfix_logging_nat44_ses_delete ( ctx->thread_index, s->in2out.addr.as_u32, s->out2in.addr.as_u32, nat_proto_to_ip_proto (s->nat_proto), s->in2out.port, s->out2in.port, - s->in2out.fib_index); + s->in2out.fib_index, s->ext_host_addr.as_u32, + s->ext_host_nat_addr.as_u32, s->ext_host_port, s->ext_host_nat_port); nat_syslog_nat44_apmdel (s->user_index, s->in2out.fib_index, &s->in2out.addr, s->in2out.port, @@ -222,7 +223,8 @@ create_session_for_static_mapping ( nat_ipfix_logging_nat44_ses_create ( thread_index, s->in2out.addr.as_u32, s->out2in.addr.as_u32, nat_proto_to_ip_proto (s->nat_proto), s->in2out.port, s->out2in.port, - s->in2out.fib_index); + s->in2out.fib_index, s->ext_host_addr.as_u32, + s->ext_host_nat_addr.as_u32, s->ext_host_port, s->ext_host_nat_port); nat_syslog_nat44_apmadd (s->user_index, s->in2out.fib_index, &s->in2out.addr, s->in2out.port, &s->out2in.addr,