lsquic_data_in_if.h revision 355db7c6
110c492f0SDmitri Tikhonov/* Copyright (c) 2017 - 2018 LiteSpeed Technologies Inc.  See LICENSE. */
250aadb33SDmitri Tikhonov/*
350aadb33SDmitri Tikhonov * lsquic_data_in_if.h -- DATA in interface
450aadb33SDmitri Tikhonov */
550aadb33SDmitri Tikhonov
650aadb33SDmitri Tikhonov#ifndef LSQUIC_DATA_IN_IF_H
750aadb33SDmitri Tikhonov#define LSQUIC_DATA_IN_IF_H 1
850aadb33SDmitri Tikhonov
950aadb33SDmitri Tikhonovstruct data_frame;
1050aadb33SDmitri Tikhonovstruct data_in;
1150aadb33SDmitri Tikhonovstruct lsquic_conn_public;
1250aadb33SDmitri Tikhonovstruct stream_frame;
1350aadb33SDmitri Tikhonov
1450aadb33SDmitri Tikhonovenum ins_frame
1550aadb33SDmitri Tikhonov{
1650aadb33SDmitri Tikhonov    INS_FRAME_OK,
1750aadb33SDmitri Tikhonov    INS_FRAME_ERR,
1850aadb33SDmitri Tikhonov    INS_FRAME_DUP,
19be4cfad0SDmitri Tikhonov    INS_FRAME_OVERLAP,
2050aadb33SDmitri Tikhonov};
2150aadb33SDmitri Tikhonov
2250aadb33SDmitri Tikhonovstruct data_in_iface
2350aadb33SDmitri Tikhonov{
2450aadb33SDmitri Tikhonov    void
2550aadb33SDmitri Tikhonov    (*di_destroy) (struct data_in *);
2650aadb33SDmitri Tikhonov
2750aadb33SDmitri Tikhonov    int
2850aadb33SDmitri Tikhonov    (*di_empty) (struct data_in *);
2950aadb33SDmitri Tikhonov
30be4cfad0SDmitri Tikhonov    /* When INS_FRAME_OK, INS_FRAME_ERR, or INS_FRAME_DUP is returned, the
31be4cfad0SDmitri Tikhonov     * caller releases control of stream frame.  Do not reference it after
32be4cfad0SDmitri Tikhonov     * the call.
33be4cfad0SDmitri Tikhonov     *
34be4cfad0SDmitri Tikhonov     * When INS_FRAME_OVERLAP is returned the caller has a choice to switch
35be4cfad0SDmitri Tikhonov     * to implementation that supports overlaps and try to insert the frame
36be4cfad0SDmitri Tikhonov     * again or to treat this as an error.  Either way, the caller retains
37be4cfad0SDmitri Tikhonov     * control of the frame.
3850aadb33SDmitri Tikhonov     */
3950aadb33SDmitri Tikhonov    enum ins_frame
4050aadb33SDmitri Tikhonov    (*di_insert_frame) (struct data_in *, struct stream_frame *,
4150aadb33SDmitri Tikhonov                                                        uint64_t read_offset);
4250aadb33SDmitri Tikhonov
4350aadb33SDmitri Tikhonov    struct data_frame *
4450aadb33SDmitri Tikhonov    (*di_get_frame) (struct data_in *, uint64_t read_offset);
4550aadb33SDmitri Tikhonov
4650aadb33SDmitri Tikhonov    void
4750aadb33SDmitri Tikhonov    (*di_frame_done) (struct data_in *, struct data_frame *);
4850aadb33SDmitri Tikhonov
4950aadb33SDmitri Tikhonov    /* Creates a new data_in object, feeds its stream frames to it, deletes
5050aadb33SDmitri Tikhonov     * itself and returns the new object.
5150aadb33SDmitri Tikhonov     */
5250aadb33SDmitri Tikhonov    struct data_in *
5350aadb33SDmitri Tikhonov    (*di_switch_impl) (struct data_in *, uint64_t read_offset);
54c51ce338SDmitri Tikhonov
55c51ce338SDmitri Tikhonov    size_t
56c51ce338SDmitri Tikhonov    (*di_mem_used) (struct data_in *);
5750aadb33SDmitri Tikhonov
58355db7c6SDmitri Tikhonov};
5950aadb33SDmitri Tikhonov
6050aadb33SDmitri Tikhonovstruct data_in
6150aadb33SDmitri Tikhonov{
6250aadb33SDmitri Tikhonov    const struct data_in_iface  *di_if;
6350aadb33SDmitri Tikhonov    enum {
6450aadb33SDmitri Tikhonov        /* If DI_SWITCH_IMPL is set, switching data_in implementation is
6550aadb33SDmitri Tikhonov         * recommended in order to get better performance for current
6650aadb33SDmitri Tikhonov         * incoming stream frame scenario.  Check the value of this flag
6750aadb33SDmitri Tikhonov         * after calls to di_insert_frame() and di_frame_done().
6850aadb33SDmitri Tikhonov         */
6950aadb33SDmitri Tikhonov        DI_SWITCH_IMPL = (1 << 0),
7050aadb33SDmitri Tikhonov    }                            di_flags;
7150aadb33SDmitri Tikhonov};
7250aadb33SDmitri Tikhonov
73be4cfad0SDmitri Tikhonov/* This implementation does not support overlapping frame and may return
74be4cfad0SDmitri Tikhonov * INS_FRAME_OVERLAP.
75be4cfad0SDmitri Tikhonov */
7650aadb33SDmitri Tikhonovstruct data_in *
7750aadb33SDmitri Tikhonovdata_in_nocopy_new (struct lsquic_conn_public *, uint32_t stream_id);
7850aadb33SDmitri Tikhonov
79be4cfad0SDmitri Tikhonov/* This implementation supports overlapping frames and will never return
80be4cfad0SDmitri Tikhonov * INS_FRAME_OVERLAP.
81be4cfad0SDmitri Tikhonov */
8250aadb33SDmitri Tikhonovstruct data_in *
8350aadb33SDmitri Tikhonovdata_in_hash_new (struct lsquic_conn_public *, uint32_t stream_id,
8450aadb33SDmitri Tikhonov                  uint64_t byteage);
8550aadb33SDmitri Tikhonov
8650aadb33SDmitri Tikhonovenum ins_frame
8750aadb33SDmitri Tikhonovdata_in_hash_insert_data_frame (struct data_in *data_in,
8850aadb33SDmitri Tikhonov                const struct data_frame *data_frame, uint64_t read_offset);
8950aadb33SDmitri Tikhonov
9050aadb33SDmitri Tikhonovstruct data_in *
9150aadb33SDmitri Tikhonovdata_in_error_new ();
9250aadb33SDmitri Tikhonov
9350aadb33SDmitri Tikhonov#endif
94