-static clib_error_t *
-snat_det_map_command_fn (vlib_main_t * vm,
- unformat_input_t * input, vlib_cli_command_t * cmd)
-{
- snat_main_t *sm = &snat_main;
- unformat_input_t _line_input, *line_input = &_line_input;
- ip4_address_t in_addr, out_addr;
- u32 in_plen, out_plen;
- int is_add = 1, rv;
- clib_error_t *error = 0;
-
- if (!sm->deterministic)
- return clib_error_return (0, SUPPORTED_ONLY_IN_DET_MODE_STR);
-
- /* Get a line of input. */
- if (!unformat_user (input, unformat_line_input, line_input))
- return 0;
-
- while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat
- (line_input, "in %U/%u", unformat_ip4_address, &in_addr, &in_plen))
- ;
- else
- if (unformat
- (line_input, "out %U/%u", unformat_ip4_address, &out_addr,
- &out_plen))
- ;
- else if (unformat (line_input, "del"))
- is_add = 0;
- else
- {
- error = clib_error_return (0, "unknown input '%U'",
- format_unformat_error, line_input);
- goto done;
- }
- }
-
- rv = snat_det_add_map (sm, &in_addr, (u8) in_plen, &out_addr, (u8) out_plen,
- is_add);
-
- if (rv)
- {
- error = clib_error_return (0, "snat_det_add_map return %d", rv);
- goto done;
- }
-
-done:
- unformat_free (line_input);
-
- return error;
-}
-
-static clib_error_t *
-nat44_det_show_mappings_command_fn (vlib_main_t * vm,
- unformat_input_t * input,
- vlib_cli_command_t * cmd)
-{
- snat_main_t *sm = &snat_main;
- snat_det_map_t *dm;
-
- if (!sm->deterministic)
- return clib_error_return (0, SUPPORTED_ONLY_IN_DET_MODE_STR);
-
- vlib_cli_output (vm, "NAT44 deterministic mappings:");
- /* *INDENT-OFF* */
- pool_foreach (dm, sm->det_maps,
- ({
- vlib_cli_output (vm, " in %U/%d out %U/%d\n",
- format_ip4_address, &dm->in_addr, dm->in_plen,
- format_ip4_address, &dm->out_addr, dm->out_plen);
- vlib_cli_output (vm, " outside address sharing ratio: %d\n",
- dm->sharing_ratio);
- vlib_cli_output (vm, " number of ports per inside host: %d\n",
- dm->ports_per_host);
- vlib_cli_output (vm, " sessions number: %d\n", dm->ses_num);
- }));
- /* *INDENT-ON* */
-
- return 0;
-}
-
-static clib_error_t *
-snat_det_forward_command_fn (vlib_main_t * vm,
- unformat_input_t * input,
- vlib_cli_command_t * cmd)
-{
- snat_main_t *sm = &snat_main;
- unformat_input_t _line_input, *line_input = &_line_input;
- ip4_address_t in_addr, out_addr;
- u16 lo_port;
- snat_det_map_t *dm;
- clib_error_t *error = 0;
-
- if (!sm->deterministic)
- return clib_error_return (0, SUPPORTED_ONLY_IN_DET_MODE_STR);
-
- /* Get a line of input. */
- if (!unformat_user (input, unformat_line_input, line_input))
- return 0;
-
- while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat (line_input, "%U", unformat_ip4_address, &in_addr))
- ;
- else
- {
- error = clib_error_return (0, "unknown input '%U'",
- format_unformat_error, line_input);
- goto done;
- }
- }
-
- dm = snat_det_map_by_user (sm, &in_addr);
- if (!dm)
- vlib_cli_output (vm, "no match");
- else
- {
- snat_det_forward (dm, &in_addr, &out_addr, &lo_port);
- vlib_cli_output (vm, "%U:<%d-%d>", format_ip4_address, &out_addr,
- lo_port, lo_port + dm->ports_per_host - 1);
- }
-
-done:
- unformat_free (line_input);
-
- return error;
-}
-
-static clib_error_t *
-snat_det_reverse_command_fn (vlib_main_t * vm,
- unformat_input_t * input,
- vlib_cli_command_t * cmd)
-{
- snat_main_t *sm = &snat_main;
- unformat_input_t _line_input, *line_input = &_line_input;
- ip4_address_t in_addr, out_addr;
- u32 out_port;
- snat_det_map_t *dm;
- clib_error_t *error = 0;
-
- if (!sm->deterministic)
- return clib_error_return (0, SUPPORTED_ONLY_IN_DET_MODE_STR);
-
- /* Get a line of input. */
- if (!unformat_user (input, unformat_line_input, line_input))
- return 0;
-
- while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat
- (line_input, "%U:%d", unformat_ip4_address, &out_addr, &out_port))
- ;
- else
- {
- error = clib_error_return (0, "unknown input '%U'",
- format_unformat_error, line_input);
- goto done;
- }
- }
-
- if (out_port < 1024 || out_port > 65535)
- {
- error = clib_error_return (0, "wrong port, must be <1024-65535>");
- goto done;
- }
-
- dm = snat_det_map_by_out (sm, &out_addr);
- if (!dm)
- vlib_cli_output (vm, "no match");
- else
- {
- snat_det_reverse (dm, &out_addr, (u16) out_port, &in_addr);
- vlib_cli_output (vm, "%U", format_ip4_address, &in_addr);
- }
-
-done:
- unformat_free (line_input);
-
- return error;
-}
-