From 720435d03531da68e18c2a0dc867aa99d2daced6 Mon Sep 17 00:00:00 2001 From: Filip Varga Date: Thu, 16 Jan 2020 14:58:47 +0100 Subject: nat: refactor of port/address allocation functions Change-Id: Ie2a3c0f44322dd8415603b7ce51bb72d72769c95 Ticket: VPP-1815 Type: refactor Signed-off-by: Filip Varga --- src/plugins/nat/lib/alloc.h | 132 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 src/plugins/nat/lib/alloc.h (limited to 'src/plugins/nat/lib/alloc.h') diff --git a/src/plugins/nat/lib/alloc.h b/src/plugins/nat/lib/alloc.h new file mode 100644 index 00000000000..9dba2ca94da --- /dev/null +++ b/src/plugins/nat/lib/alloc.h @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2020 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @file + * @brief NAT port/address allocation lib + */ + +#ifndef included_nat_lib_alloc_h__ +#define included_nat_lib_alloc_h__ + +#include + +#define foreach_nat_error \ + _(VALUE_EXIST, -1, "Value already exists") \ + _(NO_SUCH_ENTRY, -2, "No such entry") \ + _(UNKNOWN_PROTOCOL, -3, "Unknown protocol") \ + _(OUT_OF_TRANSLATIONS, -4, "Out of translations") + +#define foreach_nat_protocol \ + _(UDP, 0, udp, "udp") \ + _(TCP, 1, tcp, "tcp") \ + _(ICMP, 2, icmp, "icmp") + +typedef enum +{ +#define _(N, i, s) NAT_ERROR_##N = i, + foreach_nat_error +#undef _ +} nat_error_t; + +typedef enum +{ +#define _(N, i, n, s) NAT_PROTOCOL_##N = i, + foreach_nat_protocol +#undef _ +} nat_protocol_t; + +typedef struct nat_ip4_pool_addr_s nat_ip4_pool_addr_t; +typedef struct nat_ip4_addr_port_s nat_ip4_addr_port_t; +typedef struct nat_ip4_pool_s nat_ip4_pool_t; + +typedef void (nat_add_del_ip4_pool_addr_cb_t) (ip4_address_t addr, + u8 is_add, void *opaque); + +typedef int (nat_alloc_ip4_addr_and_port_cb_t) (nat_ip4_pool_t * pool, + u32 fib_index, + u32 thread_index, + u32 nat_thread_index, + u16 port_per_thread, + u16 protocol, + nat_ip4_addr_port_t * out); + +struct nat_ip4_pool_addr_s +{ + ip4_address_t addr; + u32 fib_index; +/* *INDENT-OFF* */ +#define _(N, i, n, s) \ + u16 busy_##n##_ports; \ + u16 * busy_##n##_ports_per_thread; \ + uword * busy_##n##_port_bitmap; + foreach_nat_protocol +#undef _ +/* *INDENT-ON* */ +}; + +struct nat_ip4_addr_port_s +{ + ip4_address_t addr; + u16 port; +}; + +struct nat_ip4_pool_s +{ + nat_add_del_ip4_pool_addr_cb_t *add_del_pool_addr_cb; + nat_alloc_ip4_addr_and_port_cb_t *alloc_addr_and_port_cb; + nat_ip4_pool_addr_t *pool_addr; + u32 random_seed; +}; + +int +nat_add_del_ip4_pool_addr (nat_ip4_pool_t * pool, + ip4_address_t addr, u8 is_add); + +int +nat_add_del_ip4_pool_addrs (nat_ip4_pool_t * pool, + ip4_address_t addr, + u32 count, u8 is_add, void *opaque); + +int +nat_alloc_ip4_addr_and_port_cb_default (nat_ip4_pool_t * pool, + u32 fib_index, + u32 thread_index, + u32 nat_thread_index, + u16 port_per_thread, + u16 protocol, + nat_ip4_addr_port_t * out); + +int +nat_alloc_ip4_addr_and_port (nat_ip4_pool_t * pool, + u32 fib_index, + u32 thread_index, + u32 nat_thread_index, + u16 port_per_thread, + u16 protocol, nat_ip4_addr_port_t * out); + +int +nat_free_ip4_addr_and_port (nat_ip4_pool_t * pool, + u32 thread_index, + u16 protocol, nat_ip4_addr_port_t * in); + +#endif /* included_nat_lib_alloc_h__ */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ -- cgit 1.2.3-korg