Hi,
Florin Coras <[email protected]> schrieb am Mi., 21. Nov. 2018 um
18:33 Uhr:
>
> On Nov 21, 2018, at 8:55 AM, Andreas Schultz <
> [email protected]> wrote:
>
> Florin Coras <[email protected]> schrieb am Mi., 21. Nov. 2018 um
> 17:18 Uhr:
>
>> Hi Andreas,
>>
>> The trace lower suggests your tcp connection was freed but you still got
>> data for it. tcp-input and the checks in established should prevent that
>> from happening and the session layer should not receive any events after
>> the transport notifies it that the session will cleaned up.
>>
> I've found a way to reproduce the problem with a mostly unmodified vpp
(see attached patch for the changes).
It turns that the crash is triggered when a tcp client is aborting
(resetting) the connection the hard way with a RST.
A normal connection close looks like this:
Client Server (VPP)
----- [FIN,ACK] ---->
<---- [FIN,ACK] -----
------- [ACK] ------>
The crash occurs when the connection is aborted like this:
Client Server (VPP)
----- [RST,ACK] ---->
For the unmodified VPP the crash looks like this:
Thread 1 "vpp_main" received signal SIGSEGV, Segmentation fault.
0x00007ffff76abda8 in tcp_handle_postponed_dequeues (wrk=0x7fffb7313b80) at
/usr/src/components/vpp/src/vnet/tcp/tcp_input.c:530
530 tc->flags &= ~TCP_CONN_DEQ_PENDING;
(gdb) bt
#0 0x00007ffff76abda8 in tcp_handle_postponed_dequeues
(wrk=0x7fffb7313b80) at /usr/src/components/vpp/src/vnet/tcp/tcp_input.c:530
#1 0x00007ffff76b1a6c in tcp46_established_inline (vm=0x7ffff708f340
<vlib_global_main>, node=0x7fffb927a3c0, frame=0x7fffb7619800, is_ip4=1) at
/usr/src/components/vpp/src/vnet/tcp/tcp_input.c:2160
#2 0x00007ffff76b1b01 in tcp4_established (vm=0x7ffff708f340
<vlib_global_main>, node=0x7fffb927a3c0, from_frame=0x7fffb7619800) at
/usr/src/components/vpp/src/vnet/tcp/tcp_input.c:2171
#3 0x00007ffff70043ec in dispatch_node (vm=0x7ffff708f340
<vlib_global_main>, node=0x7fffb927a3c0, type=VLIB_NODE_TYPE_INTERNAL,
dispatch_state=VLIB_NODE_STATE_POLLING, frame=0x7fffb7619800,
last_time_stamp=67427903546971)
at /usr/src/components/vpp/src/vlib/main.c:1154
#4 0x00007ffff70049cc in dispatch_pending_node (vm=0x7ffff708f340
<vlib_global_main>, pending_frame_index=5, last_time_stamp=67427903546971)
at /usr/src/components/vpp/src/vlib/main.c:1312
#5 0x00007ffff700665f in vlib_main_or_worker_loop (vm=0x7ffff708f340
<vlib_global_main>, is_main=1) at
/usr/src/components/vpp/src/vlib/main.c:1739
#6 0x00007ffff7006e38 in vlib_main_loop (vm=0x7ffff708f340
<vlib_global_main>) at /usr/src/components/vpp/src/vlib/main.c:1813
#7 0x00007ffff7007be4 in vlib_main (vm=0x7ffff708f340 <vlib_global_main>,
input=0x7fffb6bfffb0) at /usr/src/components/vpp/src/vlib/main.c:2006
#8 0x00007ffff7062b90 in thread0 (arg=140737337946944) at
/usr/src/components/vpp/src/vlib/unix/main.c:606
#9 0x00007ffff6e73c98 in clib_calljmp () from
/usr/src/components/vpp/build-root/install-vpp_debug-native/vpp/lib/libvppinfra.so.19.01
#10 0x00007fffffffd230 in ?? ()
#11 0x00007ffff706305d in vlib_unix_main (argc=34, argv=0x555555694230) at
/usr/src/components/vpp/src/vlib/unix/main.c:675
#12 0x000055555555d404 in main (argc=34, argv=0x555555694230) at
/usr/src/components/vpp/src/vpp/vnet/main.c:272
The reason I discovered this is that my VPP HTTP server is sending a 302
redirect with a Location header. In this case wget is doing something with
the connection that leads to the RST instead of a normal FIN.
Regards
Andreas
--
--
Dipl.-Inform. Andreas Schultz
----------------------- enabling your networks ----------------------
Travelping GmbH Phone: +49-391-81 90 99 0
Roentgenstr. 13 Fax: +49-391-81 90 99 299
39108 Magdeburg Email: [email protected]
GERMANY Web: http://www.travelping.com
Company Registration: Amtsgericht Stendal Reg No.: HRB 10578
Geschaeftsfuehrer: Holger Winkelmann VAT ID No.: DE236673780
---------------------------------------------------------------------
diff --git a/src/vnet/session-apps/http_server.c b/src/vnet/session-apps/http_server.c
index 79c2d4a7b..41001f8bf 100644
--- a/src/vnet/session-apps/http_server.c
+++ b/src/vnet/session-apps/http_server.c
@@ -96,6 +96,15 @@ static const char *http_response =
"Pragma: no-cache\r\n"
"Content-Length: %d\r\n\r\n%s";
+static const char *http_redirect =
+ "HTTP/1.1 302 OK\r\n"
+ "Location: %v\r\n"
+ "Content-Type: text/html\r\n"
+ "Cache-Control: private, no-cache, must-revalidate\r\n"
+ "Expires: Mon, 11 Jan 1970 10:10:10 GMT\r\n"
+ "Connection: close\r\n"
+ "Pragma: no-cache\r\n" "Content-Length: %d\r\n\r\n%s";
+
static const char *http_error_template =
"HTTP/1.1 %s\r\n"
"Content-Type: text/html\r\n"
@@ -416,6 +425,10 @@ out:
/* Cleanup */
vec_free (request);
hsm->rx_buf[s->thread_index] = request;
+
+ clib_warning("Session Disconnect");
+ stream_session_disconnect (s);
+
return 0;
}
@@ -585,6 +598,7 @@ http_server_create_command_fn (vlib_main_t * vm,
http_server_main_t *hsm = &http_server_main;
int rv, is_static = 0;
u64 seg_size;
+ u8 *redirect = NULL;
u8 *html;
hsm->prealloc_fifos = 0;
@@ -594,6 +608,8 @@ http_server_create_command_fn (vlib_main_t * vm,
{
if (unformat (input, "static"))
is_static = 1;
+ if (unformat (input, "redirect %v", &redirect))
+ ;
else if (unformat (input, "prealloc-fifos %d", &hsm->prealloc_fifos))
;
else if (unformat (input, "private-segment-size %U",
@@ -620,7 +636,14 @@ http_server_create_command_fn (vlib_main_t * vm,
vnet_session_enable_disable (vm, 1 /* turn on TCP, etc. */ );
- if (is_static)
+ if (redirect)
+ {
+ http_server_session_cb_vft.builtin_app_rx_callback =
+ http_server_rx_callback_static;
+ html = format (0, html_header_static);
+ static_http = format (0, http_redirect, redirect, vec_len (html), html);
+ }
+ else if (is_static)
{
http_server_session_cb_vft.builtin_app_rx_callback =
http_server_rx_callback_static;
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#11370): https://lists.fd.io/g/vpp-dev/message/11370
Mute This Topic: https://lists.fd.io/mt/19343385/21656
Mute #vnet: https://lists.fd.io/mk?hashtag=vnet&subid=1480452
Group Owner: [email protected]
Unsubscribe: https://lists.fd.io/g/vpp-dev/unsub [[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-