src/transport/reinjection_control/xqc_reinj_dgram.c (65 lines of code) (raw):
/**
* @copyright Copyright (c) 2022, Alibaba Group Holding Limited
*/
#include "src/transport/reinjection_control/xqc_reinj_dgram.h"
#include "src/transport/xqc_reinjection.h"
#include "src/transport/xqc_multipath.h"
#include "src/transport/xqc_conn.h"
#include "src/transport/xqc_send_ctl.h"
#include "src/transport/xqc_engine.h"
#include "src/transport/xqc_cid.h"
#include "src/transport/xqc_stream.h"
#include "src/transport/xqc_utils.h"
#include "src/transport/xqc_packet_out.h"
#include "src/common/xqc_common.h"
#include "src/common/xqc_malloc.h"
#include "src/common/xqc_str_hash.h"
#include "src/common/xqc_hash.h"
#include "src/common/xqc_priority_q.h"
#include "src/common/xqc_memory_pool.h"
#include "src/common/xqc_random.h"
#include "xquic/xqc_errno.h"
static size_t
xqc_dgram_reinj_ctl_size()
{
return sizeof(xqc_dgram_reinj_ctl_t);
}
static void
xqc_dgram_reinj_ctl_init(void *reinj_ctl, xqc_connection_t *conn)
{
xqc_dgram_reinj_ctl_t *rctl = (xqc_dgram_reinj_ctl_t *)reinj_ctl;
rctl->log = conn->log;
rctl->conn = conn;
}
static xqc_bool_t
xqc_dgram_reinj_can_reinject_after_send(xqc_dgram_reinj_ctl_t *rctl,
xqc_packet_out_t *po)
{
xqc_connection_t *conn = rctl->conn;
if ((po->po_frame_types & (XQC_FRAME_BIT_DATAGRAM | XQC_FRAME_BIT_CONNECTION_CLOSE))
&& !(po->po_flag & XQC_POF_NOT_REINJECT)
&& !(XQC_MP_PKT_REINJECTED(po))
&& (po->po_flag & XQC_POF_IN_FLIGHT))
{
return XQC_TRUE;
}
return XQC_FALSE;
}
static xqc_bool_t
xqc_dgram_reinj_can_reinject(void *ctl,
xqc_packet_out_t *po, xqc_reinjection_mode_t mode)
{
xqc_bool_t can_reinject = XQC_FALSE;
xqc_dgram_reinj_ctl_t *rctl = (xqc_dgram_reinj_ctl_t*)ctl;
switch (mode) {
case XQC_REINJ_UNACK_AFTER_SEND:
can_reinject = xqc_dgram_reinj_can_reinject_after_send(rctl, po);
break;
default:
can_reinject = XQC_FALSE;
break;
}
return can_reinject;
}
const xqc_reinj_ctl_callback_t xqc_dgram_reinj_ctl_cb = {
.xqc_reinj_ctl_size = xqc_dgram_reinj_ctl_size,
.xqc_reinj_ctl_init = xqc_dgram_reinj_ctl_init,
.xqc_reinj_ctl_can_reinject = xqc_dgram_reinj_can_reinject,
};