Skip to content

Commit

Permalink
Release 2.26.1
Browse files Browse the repository at this point in the history
- [BUGFIX] Migration corner cases: drop or pad over path challenge
  and response frames when necessary.
- Fix stream unit test.
  • Loading branch information
Dmitri Tikhonov committed Dec 17, 2020
1 parent 9621440 commit 71eb400
Show file tree
Hide file tree
Showing 11 changed files with 88 additions and 15 deletions.
24 changes: 12 additions & 12 deletions BUILD-WINDOWS.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
LiteSpeed QUIC (LSQUIC) Client Library - Building for Windows
=============================================================
LiteSpeed QUIC (LSQUIC) Library - Building for Windows
======================================================

Description
-----------

This document is intended to supplement the document README.md at the
root of the distribution of the LiteSpeed QUIC (LSQUIC) Client Library
root of the distribution of the LiteSpeed QUIC (LSQUIC) Library
to build the library and programs in a Windows environment.

The addition of Windows support to the LSQUIC Client was a contribution
The addition of Windows support to the LSQUIC was a contribution
from the user community and this document was based on our experiences
of validating the code. As for the overall implementation, do not hesitate
to report bugs back to us. Even better, continue to send us fixes and
Expand All @@ -30,7 +30,7 @@ Some open source code required to be installed to build the code include:
version appropriate for the development/target platform (32 vs 64-bits,
etc.).
- The Windows vcpkg package manager. It can be cloned from [here](https://github.com/Microsoft/vcpkg).
Clone it at the same level to be used to clone/develop the lsquic-client.
Clone it at the same level to be used to clone/develop the lsquic.
The package must be compiled following the instructions on the git
repository.
- Perform builds using the _Developer Command Prompt for Visual Studio_ instead
Expand All @@ -48,7 +48,7 @@ Some open source code required to be installed to build the code include:
- From the command line, once the variable above has been defined, install
both *zlib* and *libevent*. Note that libevent may also automatically
install *openssl*. If it does not, it may need to be manually specified
to properly link the lsquic-client executables.
to properly link the lsquic executables.
```
vcpkg install zlib:x64-windows-static
vcpkg install libevent:x64-windows-static
Expand All @@ -68,15 +68,15 @@ Some open source code required to be installed to build the code include:
platform to *64-bit*. Compile the project.
- Repeat the cmake and compile steps replacing *Debug* with *Release*.

Make and Compile LSQUIC-Client
------------------------------
Make and Compile LSQUIC
-----------------------


Clone lsquic-client:
Clone lsquic:

```
git clone https://github.com/litespeedtech/lsquic-client.git --recurse-submodules
cd lsquic-client
git clone https://github.com/litespeedtech/lsquic.git --recurse-submodules
cd lsquic
```

Configure the build using cmake (you can specify `Release` instead of `Debug`
Expand Down Expand Up @@ -107,4 +107,4 @@ Have fun,

LiteSpeed QUIC Team.

Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc
Copyright (c) 2017 - 2020 LiteSpeed Technologies Inc
6 changes: 6 additions & 0 deletions CHANGELOG
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
2020-12-17
- 2.26.1
- [BUGFIX] Migration corner cases: drop or pad over path challenge
and response frames when necessary.
- Fix stream unit test.

2020-12-09
- 2.26.0
- [OPTIMIZATION] Adjust packet reordering threshold when spurious losses
Expand Down
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,7 @@ ELSE()
MESSAGE(STATUS "pcreposix not found: http_server won't work")
ENDIF()
LIST(APPEND LIBS ws2_32)
LIST(APPEND LIBS iphlpapi)
ENDIF()
ENDIF() # LSQUIC_BIN OR LSQUIC_TESTS

Expand Down
2 changes: 1 addition & 1 deletion docs/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
# The short X.Y version
version = u'2.26'
# The full version, including alpha/beta/rc tags
release = u'2.26.0'
release = u'2.26.1'


# -- General configuration ---------------------------------------------------
Expand Down
2 changes: 1 addition & 1 deletion include/lsquic.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ extern "C" {

#define LSQUIC_MAJOR_VERSION 2
#define LSQUIC_MINOR_VERSION 26
#define LSQUIC_PATCH_VERSION 0
#define LSQUIC_PATCH_VERSION 1

/**
* Engine flags:
Expand Down
2 changes: 2 additions & 0 deletions src/liblsquic/lsquic_full_conn_ietf.c
Original file line number Diff line number Diff line change
Expand Up @@ -728,6 +728,8 @@ path_chal_alarm_expired (enum alarm_id al_id, void *ctx,
{
LSQ_INFO("migration to path #%u failed after none of %u path "
"challenges received responses", path_id, copath->cop_n_chals);
/* There may be a lingering challenge if its generation is delayed */
lsquic_send_ctl_cancel_chals(&conn->ifc_send_ctl, &copath->cop_path);
wipe_path(conn, path_id);
}
else
Expand Down
21 changes: 21 additions & 0 deletions src/liblsquic/lsquic_packet_out.c
Original file line number Diff line number Diff line change
Expand Up @@ -527,3 +527,24 @@ lsquic_packet_out_equal_dcids (const struct lsquic_packet_out *a,
return sizes[0] == sizes[1]
&& 0 == memcmp(dcids[0], dcids[1], sizes[0]);
}


void
lsquic_packet_out_pad_over (struct lsquic_packet_out *packet_out,
enum quic_ft_bit frame_types)
{
struct packet_out_frec_iter pofi;
struct frame_rec *frec;

for (frec = lsquic_pofi_first(&pofi, packet_out); frec;
frec = lsquic_pofi_next(&pofi))
{
if ((1 << frec->fe_frame_type) & frame_types)
{
memset(packet_out->po_data + frec->fe_off, 0, frec->fe_len);
frec->fe_frame_type = QUIC_FRAME_PADDING;
}
}

packet_out->po_frame_types &= ~frame_types;
}
5 changes: 5 additions & 0 deletions src/liblsquic/lsquic_packet_out.h
Original file line number Diff line number Diff line change
Expand Up @@ -351,4 +351,9 @@ lsquic_packet_out_turn_on_fin (struct lsquic_packet_out *,
int
lsquic_packet_out_equal_dcids (const struct lsquic_packet_out *,
const struct lsquic_packet_out *);

void
lsquic_packet_out_pad_over (struct lsquic_packet_out *packet_out,
enum quic_ft_bit frame_types);

#endif
34 changes: 34 additions & 0 deletions src/liblsquic/lsquic_send_ctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -3578,6 +3578,14 @@ lsquic_send_ctl_repath (struct lsquic_send_ctl *ctl,
packet_out->po_path = new;
if (packet_out->po_flags & PO_ENCRYPTED)
send_ctl_return_enc_data(ctl, packet_out);
if (packet_out->po_frame_types
& (QUIC_FTBIT_PATH_CHALLENGE|QUIC_FTBIT_PATH_RESPONSE))
/* This is a corner case, we just want to avoid protocol
* violation. No optimization is done. If we happen to
* send a packet of padding, oh well.
*/
lsquic_packet_out_pad_over(packet_out,
QUIC_FTBIT_PATH_CHALLENGE|QUIC_FTBIT_PATH_RESPONSE);
}

LSQ_DEBUG("repathed %u packet%.*s", count, count != 1, "s");
Expand All @@ -3594,6 +3602,32 @@ lsquic_send_ctl_repath (struct lsquic_send_ctl *ctl,
}


/* Drop PATH_CHALLENGE packets for path `path'. */
void
lsquic_send_ctl_cancel_chals (struct lsquic_send_ctl *ctl,
const struct network_path *path)
{
struct lsquic_packet_out *packet_out, *next;

/* We need only to examine the scheduled queue as lost challenges are
* not retransmitted.
*/
for (packet_out = TAILQ_FIRST(&ctl->sc_scheduled_packets); packet_out;
packet_out = next)
{
next = TAILQ_NEXT(packet_out, po_next);
if (packet_out->po_path == path
&& packet_out->po_frame_types == QUIC_FTBIT_PATH_CHALLENGE)
{
send_ctl_maybe_renumber_sched_to_right(ctl, packet_out);
send_ctl_sched_remove(ctl, packet_out);
assert(packet_out->po_loss_chain == packet_out);
send_ctl_destroy_packet(ctl, packet_out);
}
}
}


/* Examine packets in scheduled and buffered queues and resize packets if
* they exceed path MTU.
*/
Expand Down
4 changes: 4 additions & 0 deletions src/liblsquic/lsquic_send_ctl.h
Original file line number Diff line number Diff line change
Expand Up @@ -386,6 +386,10 @@ lsquic_send_ctl_repath (struct lsquic_send_ctl *ctl,
const struct network_path *old, const struct network_path *new,
int keep_path_properties);

void
lsquic_send_ctl_cancel_chals (struct lsquic_send_ctl *,
const struct network_path *);

void
lsquic_send_ctl_resize (struct lsquic_send_ctl *);

Expand Down
2 changes: 1 addition & 1 deletion tests/test_stream.c
Original file line number Diff line number Diff line change
Expand Up @@ -1077,10 +1077,10 @@ test_loc_data_rem_RST (struct test_objs *tobjs)
assert((stream->sm_qflags & SMQF_SERVICE_FLAGS) == SMQF_FREE_STREAM);
}

const unsigned expected_nread = stream->sm_bflags & SMBF_IETF ? 100 : 200;
lsquic_stream_destroy(stream);
assert(TAILQ_EMPTY(&tobjs->conn_pub.service_streams));

const unsigned expected_nread = stream->sm_bflags & SMBF_IETF ? 100 : 200;
assert(expected_nread == tobjs->conn_pub.cfcw.cf_max_recv_off);
assert(expected_nread == tobjs->conn_pub.cfcw.cf_read_off);
}
Expand Down

0 comments on commit 71eb400

Please sign in to comment.