X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Fcnat%2Fcnat_types.c;h=74c1c24389f852eb77e03a44f521b3387076f53b;hb=4d237874e;hp=ae485a48d791ff30cbc44ecd05bc20a65626515d;hpb=d63f73b8393b086d21a5197d1e02fac243867a93;p=vpp.git diff --git a/src/plugins/cnat/cnat_types.c b/src/plugins/cnat/cnat_types.c index ae485a48d79..74c1c24389f 100644 --- a/src/plugins/cnat/cnat_types.c +++ b/src/plugins/cnat/cnat_types.c @@ -18,7 +18,6 @@ cnat_main_t cnat_main; fib_source_t cnat_fib_source; cnat_timestamp_t *cnat_timestamps; -throttle_t cnat_throttle; char *cnat_error_strings[] = { #define cnat_error(n,s) s, @@ -26,17 +25,75 @@ char *cnat_error_strings[] = { #undef cnat_error }; +u8 +cnat_resolve_addr (u32 sw_if_index, ip_address_family_t af, + ip_address_t * addr) +{ + /* Tries to resolve IP from sw_if_index + * returns 1 if we need to schedule DHCP */ + if (INDEX_INVALID == sw_if_index) + return 0; + if (af == AF_IP6) + { + ip6_address_t *ip6 = 0; + ip6 = ip6_interface_first_address (&ip6_main, sw_if_index); + if (ip6) + { + ip_address_set (addr, ip6, AF_IP6); + return 0; + } + else + return 1; + } + else + { + ip4_address_t *ip4 = 0; + ip4 = ip4_interface_first_address (&ip4_main, sw_if_index, 0); + if (ip4) + { + ip_address_set (addr, ip4, AF_IP4); + return 0; + } + else + return 1; + } +} + +u8 +cnat_resolve_ep (cnat_endpoint_t * ep) +{ + int rv; + rv = cnat_resolve_addr (ep->ce_sw_if_index, ep->ce_ip.version, &ep->ce_ip); + if (0 == rv) + ep->ce_flags |= CNAT_EP_FLAG_RESOLVED; + return rv; +} + uword unformat_cnat_ep (unformat_input_t * input, va_list * args) { cnat_endpoint_t *a = va_arg (*args, cnat_endpoint_t *); + vnet_main_t *vnm = vnet_get_main (); int port = 0; clib_memset (a, 0, sizeof (*a)); + a->ce_sw_if_index = INDEX_INVALID; if (unformat (input, "%U %d", unformat_ip_address, &a->ce_ip, &port)) ; else if (unformat_user (input, unformat_ip_address, &a->ce_ip)) ; + else if (unformat (input, "%U v6 %d", unformat_vnet_sw_interface, + vnm, &a->ce_sw_if_index, &port)) + a->ce_ip.version = AF_IP6; + else if (unformat (input, "%U v6", unformat_vnet_sw_interface, + vnm, &a->ce_sw_if_index)) + a->ce_ip.version = AF_IP6; + else if (unformat (input, "%U %d", unformat_vnet_sw_interface, + vnm, &a->ce_sw_if_index, &port)) + a->ce_ip.version = AF_IP4; + else if (unformat_user (input, unformat_vnet_sw_interface, + vnm, &a->ce_sw_if_index)) + a->ce_ip.version = AF_IP4; else if (unformat (input, "%d", &port)) ; else @@ -65,25 +122,33 @@ u8 * format_cnat_endpoint (u8 * s, va_list * args) { cnat_endpoint_t *cep = va_arg (*args, cnat_endpoint_t *); - - s = format (s, "%U;%d", format_ip_address, &cep->ce_ip, cep->ce_port); - + vnet_main_t *vnm = vnet_get_main (); + if (INDEX_INVALID == cep->ce_sw_if_index) + s = format (s, "%U;%d", format_ip_address, &cep->ce_ip, cep->ce_port); + else + { + if (cep->ce_flags & CNAT_EP_FLAG_RESOLVED) + s = format (s, "%U (%U);%d", format_vnet_sw_if_index_name, vnm, + cep->ce_sw_if_index, format_ip_address, &cep->ce_ip, + cep->ce_port); + else + s = + format (s, "%U (%U);%d", format_vnet_sw_if_index_name, vnm, + cep->ce_sw_if_index, format_ip_address_family, + cep->ce_ip.version, cep->ce_port); + } return (s); } static clib_error_t * cnat_types_init (vlib_main_t * vm) { - vlib_thread_main_t *tm = &vlib_thread_main; - u32 n_vlib_mains = tm->n_vlib_mains; cnat_fib_source = fib_source_allocate ("cnat", CNAT_FIB_SOURCE_PRIORITY, FIB_SOURCE_BH_SIMPLE); + clib_rwlock_init (&cnat_main.ts_lock); - clib_spinlock_init (&cnat_main.src_ports_lock); - clib_bitmap_validate (cnat_main.src_ports, UINT16_MAX); - throttle_init (&cnat_throttle, n_vlib_mains, 1e-3); return (NULL); } @@ -120,6 +185,7 @@ cnat_config (vlib_main_t * vm, unformat_input_t * input) cm->session_max_age = CNAT_DEFAULT_SESSION_MAX_AGE; cm->tcp_max_age = CNAT_DEFAULT_TCP_MAX_AGE; cm->default_scanner_state = CNAT_SCANNER_ON; + cm->maglev_len = CNAT_DEFAULT_MAGLEV_LEN; cm->lazy_init_done = 0; while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) @@ -152,6 +218,8 @@ cnat_config (vlib_main_t * vm, unformat_input_t * input) ; else if (unformat (input, "tcp-max-age %u", &cm->tcp_max_age)) ; + else if (unformat (input, "maglev-len %u", &cm->maglev_len)) + ; else return clib_error_return (0, "unknown input '%U'", format_unformat_error, input); @@ -160,6 +228,12 @@ cnat_config (vlib_main_t * vm, unformat_input_t * input) return 0; } +cnat_main_t * +cnat_get_main () +{ + return &cnat_main; +} + VLIB_EARLY_CONFIG_FUNCTION (cnat_config, "cnat"); VLIB_INIT_FUNCTION (cnat_types_init);