X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fip%2Fpunt.c;h=7cdb5fcc084e1e3a991afc9769fc056fe0489d13;hb=4a58e49cf;hp=6f321507efe01d27031cac5de43a34e8443b8318;hpb=68577d2982a345537e300e99a8c0e0311fe08ce1;p=vpp.git diff --git a/src/vnet/ip/punt.c b/src/vnet/ip/punt.c index 6f321507efe..7cdb5fcc084 100644 --- a/src/vnet/ip/punt.c +++ b/src/vnet/ip/punt.c @@ -24,10 +24,8 @@ #include #include -#include #include #include -#include #include #include @@ -352,10 +350,10 @@ vnet_punt_socket_del (vlib_main_t * vm, const punt_reg_t * pr) } /** - * @brief Request IP traffic punt to the local TCP/IP stack. + * @brief Request IP L4 traffic punt to the local TCP/IP stack. * * @em Note - * - UDP, TCP and SCTP are the only protocols supported in the current implementation + * - UDP is the only protocol supported in the current implementation * * @param vm vlib_main_t corresponding to the current thread * @param af IP address family. @@ -371,13 +369,11 @@ punt_l4_add_del (vlib_main_t * vm, ip_address_family_t af, ip_protocol_t protocol, u16 port, bool is_add) { - /* For now we only support TCP, UDP and SCTP punt */ - if (protocol != IP_PROTOCOL_UDP && - protocol != IP_PROTOCOL_TCP && protocol != IP_PROTOCOL_SCTP) + /* For now we only support TCP and UDP punt */ + if (protocol != IP_PROTOCOL_UDP && protocol != IP_PROTOCOL_TCP) return clib_error_return (0, - "only UDP (%d), TCP (%d) and SCTP (%d) protocols are supported, got %d", - IP_PROTOCOL_UDP, IP_PROTOCOL_TCP, - IP_PROTOCOL_SCTP, protocol); + "only UDP (%d) and TCP (%d) protocols are supported, got %d", + IP_PROTOCOL_UDP, IP_PROTOCOL_TCP, protocol); if (port == (u16) ~ 0) { @@ -385,17 +381,14 @@ punt_l4_add_del (vlib_main_t * vm, udp_punt_unknown (vm, af == AF_IP4, is_add); else if (protocol == IP_PROTOCOL_TCP) tcp_punt_unknown (vm, af == AF_IP4, is_add); - else if (protocol == IP_PROTOCOL_SCTP) - sctp_punt_unknown (vm, af == AF_IP4, is_add); return 0; } else if (is_add) { - if (protocol == IP_PROTOCOL_TCP || protocol == IP_PROTOCOL_SCTP) - return clib_error_return (0, - "punt TCP/SCTP ports is not supported yet"); + if (protocol == IP_PROTOCOL_TCP) + return clib_error_return (0, "punt TCP ports is not supported yet"); udp_register_dst_port (vm, port, udp4_punt_node.index, af == AF_IP4); @@ -403,9 +396,8 @@ punt_l4_add_del (vlib_main_t * vm, } else { - if (protocol == IP_PROTOCOL_TCP || protocol == IP_PROTOCOL_SCTP) - return clib_error_return (0, - "punt TCP/SCTP ports is not supported yet"); + if (protocol == IP_PROTOCOL_TCP) + return clib_error_return (0, "punt TCP ports is not supported yet"); udp_unregister_dst_port (vm, port, af == AF_IP4); @@ -431,8 +423,9 @@ vnet_punt_add_del (vlib_main_t * vm, const punt_reg_t * pr, bool is_add) static clib_error_t * punt_cli (vlib_main_t * vm, - unformat_input_t * input, vlib_cli_command_t * cmd) + unformat_input_t * input__, vlib_cli_command_t * cmd) { + unformat_input_t line_input, *input = &line_input; clib_error_t *error = NULL; bool is_add = true; /* *INDENT-OFF* */ @@ -441,7 +434,7 @@ punt_cli (vlib_main_t * vm, .l4 = { .af = AF_IP4, .port = ~0, - .protocol = ~0, + .protocol = IP_PROTOCOL_UDP, }, }, .type = PUNT_TYPE_L4, @@ -449,16 +442,23 @@ punt_cli (vlib_main_t * vm, u32 port; /* *INDENT-ON* */ + if (!unformat_user (input__, unformat_line_input, input)) + return 0; + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { if (unformat (input, "del")) is_add = false; + else if (unformat (input, "ipv4")) + pr.punt.l4.af = AF_IP4; else if (unformat (input, "ipv6")) pr.punt.l4.af = AF_IP6; else if (unformat (input, "ip6")) pr.punt.l4.af = AF_IP6; else if (unformat (input, "%d", &port)) pr.punt.l4.port = port; + else if (unformat (input, "all")) + pr.punt.l4.port = ~0; else if (unformat (input, "udp")) pr.punt.l4.protocol = IP_PROTOCOL_UDP; else if (unformat (input, "tcp")) @@ -479,6 +479,7 @@ punt_cli (vlib_main_t * vm, } done: + unformat_free (input); return error; } @@ -505,15 +506,17 @@ done: /* *INDENT-OFF* */ VLIB_CLI_COMMAND (punt_command, static) = { .path = "set punt", - .short_help = "set punt [udp|tcp] [del] ", + .short_help = "set punt [IPV4|ip6|ipv6] [UDP|tcp] [del] [ALL|]", .function = punt_cli, }; /* *INDENT-ON* */ static clib_error_t * punt_socket_register_cmd (vlib_main_t * vm, - unformat_input_t * input, vlib_cli_command_t * cmd) + unformat_input_t * input__, + vlib_cli_command_t * cmd) { + unformat_input_t line_input, *input = &line_input; u8 *socket_name = 0; clib_error_t *error = NULL; /* *INDENT-OFF* */ @@ -522,17 +525,20 @@ punt_socket_register_cmd (vlib_main_t * vm, .l4 = { .af = AF_IP4, .port = ~0, - .protocol = ~0, + .protocol = IP_PROTOCOL_UDP, }, }, .type = PUNT_TYPE_L4, }; /* *INDENT-ON* */ + if (!unformat_user (input__, unformat_line_input, input)) + return 0; + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { if (unformat (input, "ipv4")) - ; + pr.punt.l4.af = AF_IP4; else if (unformat (input, "ipv6")) pr.punt.l4.af = AF_IP6; else if (unformat (input, "udp")) @@ -541,6 +547,8 @@ punt_socket_register_cmd (vlib_main_t * vm, pr.punt.l4.protocol = IP_PROTOCOL_TCP; else if (unformat (input, "%d", &pr.punt.l4.port)) ; + else if (unformat (input, "all")) + pr.punt.l4.port = ~0; else if (unformat (input, "socket %s", &socket_name)) ; else @@ -551,32 +559,38 @@ punt_socket_register_cmd (vlib_main_t * vm, } } - error = vnet_punt_socket_add (vm, 1, &pr, (char *) socket_name); + if (!socket_name) + error = clib_error_return (0, "socket name not specified"); + else + error = vnet_punt_socket_add (vm, 1, &pr, (char *) socket_name); done: + unformat_free (input); return error; } /*? * * @cliexpar - * @cliexcmd{punt socket register} + * @cliexcmd{punt socket register socket punt_l4_foo.sock} + ?*/ /* *INDENT-OFF* */ VLIB_CLI_COMMAND (punt_socket_register_command, static) = { .path = "punt socket register", .function = punt_socket_register_cmd, - .short_help = "punt socket register [ipv4|ipv6] [udp|tcp]> ", + .short_help = "punt socket register [IPV4|ipv6] [UDP|tcp] [ALL|] socket ", .is_mp_safe = 1, }; /* *INDENT-ON* */ static clib_error_t * punt_socket_deregister_cmd (vlib_main_t * vm, - unformat_input_t * input, + unformat_input_t * input__, vlib_cli_command_t * cmd) { + unformat_input_t line_input, *input = &line_input; clib_error_t *error = NULL; /* *INDENT-OFF* */ punt_reg_t pr = { @@ -584,17 +598,20 @@ punt_socket_deregister_cmd (vlib_main_t * vm, .l4 = { .af = AF_IP4, .port = ~0, - .protocol = ~0, + .protocol = IP_PROTOCOL_UDP, }, }, .type = PUNT_TYPE_L4, }; /* *INDENT-ON* */ + if (!unformat_user (input__, unformat_line_input, input)) + return 0; + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { if (unformat (input, "ipv4")) - ; + pr.punt.l4.af = AF_IP4; else if (unformat (input, "ipv6")) pr.punt.l4.af = AF_IP6; else if (unformat (input, "udp")) @@ -603,6 +620,8 @@ punt_socket_deregister_cmd (vlib_main_t * vm, pr.punt.l4.protocol = IP_PROTOCOL_TCP; else if (unformat (input, "%d", &pr.punt.l4.port)) ; + else if (unformat (input, "all")) + pr.punt.l4.port = ~0; else { error = clib_error_return (0, "parse error: '%U'", @@ -613,6 +632,7 @@ punt_socket_deregister_cmd (vlib_main_t * vm, error = vnet_punt_socket_del (vm, &pr); done: + unformat_free (input); return error; } @@ -626,7 +646,7 @@ VLIB_CLI_COMMAND (punt_socket_deregister_command, static) = { .path = "punt socket deregister", .function = punt_socket_deregister_cmd, - .short_help = "punt socket deregister [ipv4|ipv6] [udp|tcp]> ", + .short_help = "punt socket deregister [IPV4|ipv6] [UDP|tcp] [ALL|]", .is_mp_safe = 1, }; /* *INDENT-ON* */ @@ -718,13 +738,17 @@ punt_client_show_one (const punt_client_t * pc, void *ctx) static clib_error_t * punt_socket_show_cmd (vlib_main_t * vm, - unformat_input_t * input, vlib_cli_command_t * cmd) + unformat_input_t * input__, vlib_cli_command_t * cmd) { + unformat_input_t line_input, *input = &line_input; clib_error_t *error = NULL; punt_type_t pt; pt = PUNT_TYPE_L4; + if (!unformat_user (input__, unformat_line_input, input)) + return 0; + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { if (unformat (input, "exception")) @@ -744,6 +768,7 @@ punt_socket_show_cmd (vlib_main_t * vm, punt_client_walk (pt, punt_client_show_one, vm); done: + unformat_free (input); return (error); } @@ -767,6 +792,7 @@ ip_punt_init (vlib_main_t * vm) { clib_error_t *error = NULL; punt_main_t *pm = &punt_main; + vlib_thread_main_t *tm = vlib_get_thread_main (); pm->is_configured = false; pm->interface_output_node = @@ -777,6 +803,9 @@ ip_punt_init (vlib_main_t * vm) pm->hdl = vlib_punt_client_register ("ip-punt"); + vec_validate_aligned (pm->thread_data, tm->n_vlib_mains, + CLIB_CACHE_LINE_BYTES); + return (error); } @@ -840,7 +869,7 @@ punt_config (vlib_main_t * vm, unformat_input_t * input) clib_file_t template = { 0 }; template.read_function = punt_socket_read_ready; template.file_descriptor = pm->socket_fd; - template.description = format (0, "%s", socket_path); + template.description = format (0, "punt socket %s", socket_path); pm->clib_file_index = clib_file_add (fm, &template); pm->is_configured = true;