From 61d095ed37c90058fec0e728ebfbac038beb0504 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Wed, 24 Feb 2021 09:07:52 +0100 Subject: [PATCH] DOC: muxes: add a diagram of the exchanges between muxes and outer world Since the muxes API is far from being obvious, let's show a stream being forwarded between two sides through muxes with their buffers and the transport layers. The diagram is provided in .fig, .svg, .png, and .pdf. --- doc/internals/muxes.fig | 402 ++++++++++++++++++ doc/internals/muxes.pdf | Bin 0 -> 12445 bytes doc/internals/muxes.png | Bin 0 -> 35415 bytes doc/internals/muxes.svg | 914 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 1316 insertions(+) create mode 100644 doc/internals/muxes.fig create mode 100644 doc/internals/muxes.pdf create mode 100644 doc/internals/muxes.png create mode 100644 doc/internals/muxes.svg diff --git a/doc/internals/muxes.fig b/doc/internals/muxes.fig new file mode 100644 index 000000000..23f82e501 --- /dev/null +++ b/doc/internals/muxes.fig @@ -0,0 +1,402 @@ +#FIG 3.2 Produced by xfig version 3.2.7b +Landscape +Center +Inches +Letter +100.00 +Single +-1 +1200 2 +0 32 #bbf2e2 +0 33 #a7ceb3 +0 34 #dae8fc +0 35 #458dba +0 36 #ffe6cc +0 37 #e9b000 +0 38 #1a1a1a +0 39 #8e8e8e +0 40 #ffc1e7 +6 4200 8700 4800 9825 +2 1 0 4 35 -1 48 -1 -1 0.000 0 0 -1 0 0 4 + 4261 9751 4261 8751 4761 8751 4761 9751 +2 3 0 0 -1 34 49 -1 20 0.000 0 0 -1 0 0 5 + 4761 9751 4761 8751 4261 8751 4261 9751 4761 9751 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 4261 8850 4761 8850 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 4261 8925 4761 8925 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 4261 9000 4761 9000 +-6 +6 1425 3525 2025 4650 +2 1 0 4 35 -1 48 -1 -1 0.000 0 0 -1 0 0 4 + 1486 4576 1486 3576 1986 3576 1986 4576 +2 3 0 0 -1 34 49 -1 20 0.000 0 0 -1 0 0 5 + 1986 4576 1986 3576 1486 3576 1486 4576 1986 4576 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 1486 3675 1986 3675 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 1486 3750 1986 3750 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 1486 3825 1986 3825 +-6 +6 3225 3525 3825 4650 +2 1 0 4 35 -1 48 -1 -1 0.000 0 0 -1 0 0 4 + 3286 4576 3286 3576 3786 3576 3786 4576 +2 3 0 0 -1 34 49 -1 20 0.000 0 0 -1 0 0 5 + 3786 4576 3786 3576 3286 3576 3286 4576 3786 4576 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 3286 3675 3786 3675 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 3286 3750 3786 3750 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 3286 3825 3786 3825 +-6 +6 5025 3525 5625 4650 +2 1 0 4 35 -1 48 -1 -1 0.000 0 0 -1 0 0 4 + 5086 4576 5086 3576 5586 3576 5586 4576 +2 3 0 0 -1 34 49 -1 20 0.000 0 0 -1 0 0 5 + 5586 4576 5586 3576 5086 3576 5086 4576 5586 4576 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 5086 3675 5586 3675 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 5086 3750 5586 3750 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 5086 3825 5586 3825 +-6 +6 6900 3525 7500 4650 +2 1 0 4 35 -1 48 -1 -1 0.000 0 0 -1 0 0 4 + 6961 4576 6961 3576 7461 3576 7461 4576 +2 3 0 0 -1 34 49 -1 20 0.000 0 0 -1 0 0 5 + 7461 4576 7461 3576 6961 3576 6961 4576 7461 4576 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 6961 3675 7461 3675 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 6961 3750 7461 3750 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 6961 3825 7461 3825 +-6 +6 11925 10725 13875 11475 +2 4 0 3 0 35 50 -1 20 0.000 1 0 7 0 0 5 + 13800 11400 12000 11400 12000 10800 13800 10800 13800 11400 +4 1 0 49 -1 4 18 0.0000 4 270 1410 12900 11175 Transport\001 +-6 +6 6600 1200 10050 1800 +2 1 0 4 35 -1 48 -1 -1 0.000 0 0 -1 0 0 4 + 6692 1261 9959 1261 9959 1761 6692 1761 +2 3 0 0 -1 34 49 -1 20 0.000 0 0 -1 0 0 5 + 6692 1761 9959 1761 9959 1261 6692 1261 6692 1761 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 9750 1261 9750 1761 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 9525 1261 9525 1761 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 9300 1261 9300 1761 +4 1 0 46 -1 4 16 0.0000 4 210 1620 8025 1575 channel buf\001 +-6 +6 12375 8100 12900 8700 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 12600 8161 12600 8661 +2 1 0 4 35 -1 48 -1 -1 0.000 0 0 -1 0 0 4 + 12425 8161 12825 8161 12825 8661 12425 8661 +2 3 0 0 -1 34 49 -1 20 0.000 0 0 -1 0 0 5 + 12425 8661 12825 8661 12825 8161 12425 8161 12425 8661 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 12675 8161 12675 8661 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 12750 8161 12750 8661 +-6 +6 11700 8100 12225 8700 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 11925 8161 11925 8661 +2 1 0 4 35 -1 48 -1 -1 0.000 0 0 -1 0 0 4 + 11750 8161 12150 8161 12150 8661 11750 8661 +2 3 0 0 -1 34 49 -1 20 0.000 0 0 -1 0 0 5 + 11750 8661 12150 8661 12150 8161 11750 8161 11750 8661 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 12000 8161 12000 8661 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 12075 8161 12075 8661 +-6 +6 11025 8100 11550 8700 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 11250 8161 11250 8661 +2 1 0 4 35 -1 48 -1 -1 0.000 0 0 -1 0 0 4 + 11075 8161 11475 8161 11475 8661 11075 8661 +2 3 0 0 -1 34 49 -1 20 0.000 0 0 -1 0 0 5 + 11075 8661 11475 8661 11475 8161 11075 8161 11075 8661 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 11325 8161 11325 8661 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 11400 8161 11400 8661 +-6 +6 10350 8100 10875 8700 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 10575 8161 10575 8661 +2 1 0 4 35 -1 48 -1 -1 0.000 0 0 -1 0 0 4 + 10400 8161 10800 8161 10800 8661 10400 8661 +2 3 0 0 -1 34 49 -1 20 0.000 0 0 -1 0 0 5 + 10400 8661 10800 8661 10800 8161 10400 8161 10400 8661 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 10650 8161 10650 8661 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 10725 8161 10725 8661 +-6 +6 13050 8100 13575 8700 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 13275 8161 13275 8661 +2 1 0 4 35 -1 48 -1 -1 0.000 0 0 -1 0 0 4 + 13100 8161 13500 8161 13500 8661 13100 8661 +2 3 0 0 -1 34 49 -1 20 0.000 0 0 -1 0 0 5 + 13100 8661 13500 8661 13500 8161 13100 8161 13100 8661 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 13350 8161 13350 8661 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 13425 8161 13425 8661 +-6 +6 13725 8100 14250 8700 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 13950 8161 13950 8661 +2 1 0 4 35 -1 48 -1 -1 0.000 0 0 -1 0 0 4 + 13775 8161 14175 8161 14175 8661 13775 8661 +2 3 0 0 -1 34 49 -1 20 0.000 0 0 -1 0 0 5 + 13775 8661 14175 8661 14175 8161 13775 8161 13775 8661 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 14025 8161 14025 8661 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 14100 8161 14100 8661 +-6 +6 11100 11700 13050 12150 +1 1 0 4 20 40 49 -1 20 0.000 1 0.0000 11400 11925 225 150 11400 11925 11625 12075 +4 0 0 49 -1 4 12 0.0000 4 180 1170 11850 12000 I/O tasklet\001 +-6 +6 11100 12300 11700 12600 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 11357 12331 11357 12581 +2 1 0 4 35 -1 48 -1 -1 0.000 0 0 -1 0 0 4 + 11157 12331 11614 12331 11614 12581 11157 12581 +2 3 0 0 -1 34 49 -1 20 0.000 0 0 -1 0 0 5 + 11157 12581 11614 12581 11614 12331 11157 12331 11157 12581 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 11443 12331 11443 12581 +2 1 0 2 35 -1 47 -1 -1 0.000 0 0 -1 0 0 2 + 11529 12331 11529 12581 +-6 +1 3 0 3 0 0 49 -1 20 0.000 1 0.0000 10725 5700 75 75 10725 5700 10800 5700 +1 3 0 3 0 0 49 -1 20 0.000 1 0.0000 12750 5700 75 75 12750 5700 12825 5700 +1 3 0 3 0 0 49 -1 20 0.000 1 0.0000 13875 5700 75 75 13875 5700 13950 5700 +1 3 0 3 0 0 49 -1 20 0.000 1 0.0000 11700 5700 75 75 11700 5700 11775 5700 +1 3 0 3 0 0 49 -1 20 0.000 1 0.0000 2925 6750 75 75 2925 6750 3000 6750 +1 3 0 3 0 0 49 -1 20 0.000 1 0.0000 4950 6750 75 75 4950 6750 5025 6750 +1 3 0 3 0 0 49 -1 20 0.000 1 0.0000 6075 6750 75 75 6075 6750 6150 6750 +1 3 0 3 0 0 49 -1 20 0.000 1 0.0000 3900 6750 75 75 3900 6750 3975 6750 +1 1 0 4 37 36 49 -1 20 0.000 1 0.0000 9525 4140 583 250 9525 4140 10108 3890 +1 1 0 4 37 36 49 -1 20 0.000 1 0.0000 11341 4140 583 250 11341 4140 11924 3890 +1 1 0 4 37 36 49 -1 20 0.000 1 0.0000 13154 4140 583 250 13154 4140 13737 3890 +1 1 0 4 37 36 49 -1 20 0.000 1 0.0000 15033 4140 583 250 15033 4140 15616 3890 +1 1 0 4 37 36 49 -1 20 0.000 1 0.0000 7182 5173 583 250 7182 5173 7765 4923 +1 1 0 4 37 36 49 -1 20 0.000 1 0.0000 3507 5173 583 250 3507 5173 4090 4923 +1 1 0 4 37 36 49 -1 20 0.000 1 0.0000 1719 5173 583 250 1719 5173 2302 4923 +1 1 0 4 37 36 49 -1 20 0.000 1 0.0000 5325 5175 583 250 5325 5175 5908 4925 +1 1 0 4 10 11 45 -1 20 0.000 1 0.0000 4488 8082 612 250 4488 8082 5100 8082 +1 1 0 4 20 40 49 -1 20 0.000 1 0.0000 8400 600 900 210 8400 600 9300 600 +1 1 0 4 10 11 49 -1 20 0.000 1 0.0000 12333 7025 417 250 12333 7025 12750 7025 +1 1 0 4 20 40 49 -1 20 0.000 1 0.0000 12392 9240 808 210 12392 9240 13200 9240 +1 1 0 4 20 40 49 -1 20 0.000 1 0.0000 3167 9240 808 210 3167 9240 3975 9240 +1 1 0 4 37 36 49 -1 20 0.000 1 0.0000 1800 11925 225 150 1800 11925 2025 12075 +1 1 0 4 10 11 45 -1 20 0.000 1 0.0000 6600 11925 225 150 6600 11925 6825 12075 +2 1 1 1 0 7 49 -1 -1 4.000 1 0 -1 0 0 2 + 2550 3300 2550 6150 +2 1 1 1 0 7 49 -1 -1 4.000 1 0 -1 0 0 2 + 4500 3300 4500 6150 +2 1 1 1 0 7 49 -1 -1 4.000 1 0 -1 0 0 2 + 6300 3300 6300 6150 +2 1 0 3 0 7 49 -1 -1 8.000 1 0 -1 1 0 2 + 1 1 1.00 90.00 180.00 + 600 8025 600 11700 +2 1 0 3 0 7 49 -1 -1 8.000 1 0 -1 1 0 2 + 1 1 1.00 90.00 180.00 + 600 3150 600 1800 +2 1 0 3 0 7 49 -1 -1 8.000 1 0 -1 1 0 2 + 1 1 1.00 90.00 180.00 + 600 1500 600 150 +2 1 0 3 0 7 49 -1 -1 0.000 1 0 -1 1 1 4 + 1 1 1.00 90.00 180.00 + 1 1 1.00 90.00 180.00 + 3000 3300 3000 1425 3675 600 7500 600 +2 3 0 4 33 32 50 -1 20 0.000 0 0 -1 0 0 5 + 900 3300 900 9900 8100 9900 8100 3300 900 3300 +2 1 0 3 0 7 49 -1 -1 0.000 1 0 -1 1 0 4 + 1 1 1.00 90.00 180.00 + 3525 3525 3525 2625 4500 1500 6750 1500 +2 1 0 3 0 7 49 -1 -1 0.000 1 0 -1 1 0 3 + 1 1 1.00 90.00 180.00 + 11295 4425 11295 4725 11700 5625 +2 1 0 3 0 7 49 -1 -1 0.000 1 0 -1 1 0 3 + 1 1 1.00 90.00 180.00 + 9495 4425 9495 4725 10695 5700 +2 1 0 3 0 7 49 -1 -1 0.000 1 0 -1 1 0 3 + 1 1 1.00 90.00 180.00 + 13163 4425 13163 4725 12788 5625 +2 1 0 3 0 7 49 -1 -1 0.000 1 0 -1 1 0 3 + 1 1 1.00 90.00 180.00 + 15013 4427 15013 4725 13888 5702 +2 1 0 3 0 7 49 -1 -1 8.000 1 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 9525 3525 9525 3825 +2 1 0 3 0 7 49 -1 -1 8.000 1 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 13125 3525 13125 3825 +2 1 0 3 0 7 49 -1 -1 8.000 1 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 15000 3525 15000 3825 +2 1 0 3 0 7 49 -1 -1 8.000 1 0 -1 1 0 5 + 1 1 1.00 90.00 180.00 + 12300 7275 12300 7725 9975 7725 9975 8400 10425 8400 +2 1 0 3 0 7 49 -1 -1 0.000 1 0 -1 1 0 3 + 1 1 1.00 90.00 180.00 + 11775 5850 12300 6450 12300 6825 +2 1 1 3 0 7 49 -1 -1 8.000 1 0 -1 0 0 3 + 11475 6150 13200 6150 13200 6825 +2 1 0 3 0 7 49 -1 -1 0.000 1 0 -1 0 1 3 + 1 1 1.00 90.00 180.00 + 3975 6900 4500 7650 4500 7875 +2 1 0 3 0 7 49 -1 -1 0.000 1 0 -1 0 1 3 + 1 1 1.00 90.00 180.00 + 3495 5475 3495 5775 3900 6675 +2 1 0 3 0 7 49 -1 -1 0.000 1 0 -1 0 1 3 + 1 1 1.00 90.00 180.00 + 1695 5475 1695 5775 2895 6750 +2 1 0 3 0 7 49 -1 -1 0.000 1 0 -1 0 1 3 + 1 1 1.00 90.00 180.00 + 7213 5477 7213 5775 6088 6752 +2 1 0 3 0 7 49 -1 -1 8.000 1 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 1725 4875 1725 4575 +2 1 0 3 0 7 49 -1 -1 8.000 1 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 3525 4875 3525 4575 +2 1 0 3 0 7 49 -1 -1 8.000 1 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 5325 4875 5325 4575 +2 1 0 3 0 7 49 -1 -1 8.000 1 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7200 4875 7200 4575 +2 1 0 3 0 7 49 -1 -1 0.000 1 0 -1 0 1 2 + 1 1 1.00 90.00 180.00 + 4500 8325 4500 8721 +2 1 1 3 0 7 49 -1 -1 8.000 1 0 -1 0 0 3 + 3225 7875 3225 7350 4725 7350 +2 1 0 3 0 7 49 -1 -1 0.000 1 0 -1 1 1 2 + 1 1 1.00 90.00 180.00 + 1 1 1.00 90.00 180.00 + 3900 10800 3225 9450 +2 1 0 3 0 7 49 -1 -1 8.000 1 0 -1 1 0 2 + 1 1 1.00 90.00 180.00 + 4500 10800 4500 9750 +2 1 0 3 0 7 49 -1 -1 0.000 1 0 -1 1 1 3 + 1 1 1.00 90.00 180.00 + 1 1 1.00 90.00 180.00 + 12375 10800 12375 9750 12375 9450 +2 1 1 1 0 7 49 -1 -1 4.000 1 0 -1 0 0 2 + 12225 3300 12225 5025 +2 1 1 1 0 7 49 -1 -1 4.000 1 0 -1 0 0 2 + 10425 3300 10425 5025 +2 1 1 1 0 7 49 -1 -1 4.000 1 0 -1 0 0 2 + 14025 3300 14025 5025 +2 1 0 3 0 7 49 -1 -1 8.000 1 0 -1 1 0 4 + 1 1 1.00 90.00 180.00 + 9975 1500 10800 1500 11325 2100 11325 3825 +2 1 0 3 0 7 49 -1 -1 8.000 1 0 -1 1 1 4 + 1 1 1.00 90.00 180.00 + 1 1 1.00 90.00 180.00 + 9300 600 11175 600 11775 1275 11775 3300 +2 3 0 4 33 32 50 -1 20 0.000 0 0 -1 0 0 5 + 8700 3300 8700 9900 15900 9900 15900 3300 8700 3300 +2 1 0 3 0 7 49 -1 -1 8.000 1 0 -1 0 1 5 + 1 1 1.00 90.00 180.00 + 13200 10800 13200 10200 14625 9750 14625 8400 14175 8400 +2 1 0 3 0 7 49 -1 -1 0.000 1 0 -1 0 1 3 + 1 1 1.00 90.00 180.00 + 5325 5475 5325 5775 4950 6675 +2 1 0 3 0 7 49 -1 -1 8.000 1 0 -1 1 0 2 + 1 1 1.00 90.00 180.00 + 600 5400 600 3300 +2 1 0 3 0 7 49 -1 -1 8.000 1 0 -1 0 0 2 + 600 7800 600 5700 +2 4 0 3 0 35 50 -1 20 0.000 1 0 7 0 0 5 + 5400 11400 3600 11400 3600 10800 5400 10800 5400 11400 +2 1 0 3 0 7 49 -1 -1 8.000 1 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 12150 8400 12450 8400 +2 1 0 3 0 7 49 -1 -1 8.000 1 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 11475 8400 11775 8400 +2 1 0 3 0 7 49 -1 -1 8.000 1 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 10800 8400 11100 8400 +2 1 0 3 0 7 49 -1 -1 8.000 1 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 12825 8400 13125 8400 +2 1 0 3 0 7 49 -1 -1 8.000 1 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 13500 8400 13800 8400 +2 4 0 3 0 35 50 -1 20 0.000 1 0 7 0 0 5 + 2100 12600 1575 12600 1575 12300 2100 12300 2100 12600 +2 4 0 3 33 32 50 -1 20 0.000 1 0 7 0 0 5 + 6900 12600 6375 12600 6375 12300 6900 12300 6900 12600 +4 1 0 49 -1 4 14 1.5708 4 225 1365 450 825 application\001 +4 1 0 49 -1 4 14 1.5708 4 180 2820 450 9450 connection = cs->conn\001 +4 1 38 48 -1 4 12 0.0000 4 180 1230 8409 657 si_cs_io_cb\001 +4 0 0 49 -1 4 12 1.5708 4 180 2820 2850 3225 mux->subscribe(SUB_RECV)\001 +4 1 0 46 -1 4 16 1.5708 4 210 750 3600 4200 rxbuf\001 +4 1 0 46 -1 4 16 1.5708 4 210 645 4575 9375 dbuf\001 +4 1 0 49 -1 4 12 1.5708 4 195 1185 900 825 (eg: checks,\001 +4 1 0 49 -1 4 12 1.5708 4 180 1200 1125 750 stream-int)\001 +4 1 0 49 -1 4 16 0.0000 4 195 600 12300 7125 MUX\001 +4 1 0 44 -1 4 16 0.0000 4 195 960 4500 8175 DEMUX\001 +4 2 0 49 -1 4 12 0.0000 4 150 1080 3600 8100 Stream ID\001 +4 0 0 49 -1 4 12 0.0000 4 150 1080 12825 7125 Stream ID\001 +4 2 0 49 -1 4 12 0.0000 4 195 1845 3300 10125 tasklet_wakeup()\001 +4 2 0 49 -1 4 12 0.0000 4 195 1845 12150 10125 tasklet_wakeup()\001 +4 2 0 49 -1 4 12 0.0000 4 180 1590 11175 3150 mux->snd_buf()\001 +4 0 0 49 -1 4 12 0.0000 4 180 1605 3675 3225 mux->rcv_buf()\001 +4 0 0 49 -1 4 12 0.0000 4 195 2130 13425 10575 xprt->snd_buf(mbuf)\001 +4 0 0 49 -1 4 12 0.0000 4 195 2070 4725 10500 xprt->rcv_buf(dbuf)\001 +4 1 0 49 -1 4 12 0.0000 4 165 3465 8400 2100 HTX contents when mode==HTTP\001 +4 0 0 49 -1 4 12 0.0000 4 180 2430 13125 675 snd_buf() will move the\001 +4 0 0 49 -1 4 12 0.0000 4 195 2490 13125 975 buffer (zero-copy) when\001 +4 0 0 49 -1 4 12 0.0000 4 195 2595 13125 1275 the destination is empty.\001 +4 2 0 49 -1 4 12 0.0000 4 195 1845 7500 450 tasklet_wakeup()\001 +4 0 0 49 -1 4 12 0.0000 4 195 1845 9300 450 tasklet_wakeup()\001 +4 1 38 48 -1 4 12 0.0000 4 165 735 9534 4200 encode\001 +4 1 38 48 -1 4 12 0.0000 4 165 735 11325 4200 encode\001 +4 1 38 48 -1 4 12 0.0000 4 165 735 13134 4200 encode\001 +4 1 38 48 -1 4 12 0.0000 4 165 735 15009 4200 encode\001 +4 1 38 48 -1 4 12 0.0000 4 165 735 1725 5250 decode\001 +4 1 38 48 -1 4 12 0.0000 4 165 735 3525 5250 decode\001 +4 1 38 48 -1 4 12 0.0000 4 165 735 5325 5250 decode\001 +4 1 38 48 -1 4 12 0.0000 4 165 735 7200 5250 decode\001 +4 1 38 48 -1 4 12 0.0000 4 180 1155 12375 9300 mux_io_cb\001 +4 0 0 49 -1 4 12 1.5708 4 180 2835 12075 3225 mux->subscribe(SUB_SEND)\001 +4 1 0 49 -1 4 14 1.5708 4 165 1605 450 4500 mux streams\001 +4 1 0 49 -1 4 14 1.5708 4 150 2145 450 6750 mux=conn->mux\001 +4 1 0 49 -1 4 14 1.5708 4 180 1590 450 2550 conn_stream\001 +4 0 0 49 -1 4 12 0.0000 4 150 660 12900 75 Notes:\001 +4 0 0 49 -1 4 12 0.0000 4 180 2175 12975 375 - mux->rcv_buf() and\001 +4 0 0 49 -1 4 12 0.0000 4 195 2475 12975 1650 - the application is also\001 +4 0 0 49 -1 4 12 0.0000 4 195 2655 13125 1950 called the data layer and\001 +4 0 0 49 -1 4 12 0.0000 4 180 2925 13125 2250 is cs->data and cs->data_cb\001 +4 0 0 49 -1 4 12 0.0000 4 195 2940 12975 2550 - transport layers (xprt) are\001 +4 0 0 49 -1 4 12 0.0000 4 195 2520 13125 2775 stackable. conn->xprt is\001 +4 0 0 49 -1 4 12 0.0000 4 195 1770 13125 3000 the topmost one.\001 +4 1 0 49 -1 4 18 0.0000 4 270 1410 4500 11175 Transport\001 +4 1 0 46 -1 4 16 0.0000 4 210 735 14625 8175 mbuf\001 +4 1 38 48 -1 4 12 0.0000 4 180 1155 3159 9300 mux_io_cb\001 +4 0 0 49 -1 4 12 0.0000 4 195 2910 2250 12000 encoding/decoding function\001 +4 0 0 49 -1 4 12 0.0000 4 195 1635 2250 12525 transport layer\001 +4 0 0 49 -1 4 12 0.0000 4 195 2730 7050 12525 multiplexer (MUX/DEMUX)\001 +4 0 0 49 -1 4 12 0.0000 4 195 2895 7050 12000 general processing function\001 +4 0 0 49 -1 4 12 0.0000 4 195 3255 11775 12525 stream buffer (byte-level FIFO)\001 +4 2 0 49 -1 4 12 0.0000 4 195 2835 3675 10725 xprt->subscribe(SUB_RECV)\001 +4 2 0 49 -1 4 12 0.0000 4 195 2850 12225 10725 xprt->subscribe(SUB_SEND)\001 diff --git a/doc/internals/muxes.pdf b/doc/internals/muxes.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d0c6432f8207e6be4514c87f46c26ef458385a2c GIT binary patch literal 12445 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 literal 0 HcmV?d00001 diff --git a/doc/internals/muxes.png b/doc/internals/muxes.png new file mode 100644 index 0000000000000000000000000000000000000000..a5a0102b620958e4277f319afafe4af1bdd4aef6 GIT binary patch literal 35415 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Transport + + + + + + + + + + + + + + + + + +I/O tasklet + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +application + + +connection = cs->conn + + +mux->subscribe(SUB_RECV) + + +(eg: checks, + + +stream-int) + +MUX + +Stream ID + +Stream ID + +tasklet_wakeup() + +tasklet_wakeup() + +mux->snd_buf() + +mux->rcv_buf() + +xprt->snd_buf(mbuf) + +xprt->rcv_buf(dbuf) + +HTX contents when mode==HTTP + +snd_buf() will move the + +buffer (zero-copy) when + +the destination is empty. + +tasklet_wakeup() + +tasklet_wakeup() + + +mux->subscribe(SUB_SEND) + + +mux streams + + +mux=conn->mux + + +conn_stream + +Notes: + +- mux->rcv_buf() and + +- the application is also + +called the data layer and + +is cs->data and cs->data_cb + +- transport layers (xprt) are + +stackable. conn->xprt is + +the topmost one. + +Transport + +encoding/decoding function + +transport layer + +multiplexer (MUX/DEMUX) + +general processing function + +stream buffer (byte-level FIFO) + +xprt->subscribe(SUB_RECV) + +xprt->subscribe(SUB_SEND) + + + + + + + + + + + + + + + + + + + + + + + + + + + +si_cs_io_cb + +encode + +encode + +encode + +encode + +decode + +decode + +decode + +decode + +mux_io_cb + +mux_io_cb + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +channel buf + + +rxbuf + + +dbuf + +mbuf + + + + + +DEMUX + +